今天项目遇到一个从来没有遇到的问题(接手别人写的项目),使用MJRfresh,tableview 下拉刷新后不等请求完成再次使劲往下拉(每次下拉刷新会先把数组清空),此时程序crash,控制台显示:invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_Run.....,这个crash令人有点摸不着头脑,立马百度Google了一下,找到一条相关的内容,
.runloop 作用的太多 超过其限制(本人出现的问题是 tableView 的 reloadData太多。也就是说在tableView正在帮你绘制视图时,你又连续发了好几个reloadData的请求) 链接:测试 提交审核 下载的各种问题集锦
借鉴强大的网络,借鉴别人的方法
UITableview 调用reloadData刷新tableview的时候,偶尔会出现崩溃的现象。出现这种情况大多数是在动态改变Datasource的同时tableview还处于滚动动的状态。Tableview动态改变Datasource与tablewview 调用reloadData方法之间存在时间差,如果此时tableview处于滑动状态,有可能会导致Datasoure下标越界造成Cash.解决办法就是将动态改变datasource和调用reloadData方法同时放在主线程里去处理,先改变datasource立即调用reloaddata。
dispatch_async(dispatch_get_main_queue(), ^{
self.dataSourceArray= a new Array.
[self.tableView reloadData];
});
然而 同样crash
继续运行复现crash,发现第一步crash到tableview的DataSource 方法cellforRow中,通过indexPath.row 从数据源中取model哪一行代码,由此推测是数组越界,果然 在控制台 po一下数组count 为<nil>,所以进行了代码约束,通过测试未在出现crash
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
InvitationListModal*modal;
if (self.invitationDataArray.count > 0) {
modal=self.invitationDataArray[indexPath.row];
}
// InvitationListModal*modal=self.invitationDataArray[indexPath.row];//程序第一次crash到这里
if([modal.newsPicTypeisEqualToString:@"2"]) {
InvitationImageTableViewCell*cell=[tableView dequeueReusableCellWithIdentifier:InvitationSubImageCellString forIndexPath:indexPath];
cell.selectionStyle=UITableViewCellSelectionStyleNone;
cell.backgroundColor=[UIColorwhiteColor];
if(modal) {
cell.modal=modal;
}
returncell;
}
else
{
InvitationTextTableViewCell*cell=[tableView dequeueReusableCellWithIdentifier:InvitationSubTextCellString forIndexPath:indexPath];
cell.selectionStyle=UITableViewCellSelectionStyleNone;
cell.backgroundColor=[UIColorwhiteColor];
if(modal) {
cell.modal=modal;
}
returncell;
}
}
但是感觉还是哪里不对, 如果是数组越界,应该是报数组越界的错,而invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_Run.....这个崩溃日志,还是摸不着头脑
如果了解相关内容, 请留言告知,不胜感激