UITableView 在快速滚动时崩溃
Posted
技术标签:
【中文标题】UITableView 在快速滚动时崩溃【英文标题】:UITableView Crashes on Fast Scroll 【发布时间】:2011-08-19 14:05:12 【问题描述】:我有一个 TableView 填充从 NSFetchedResultsController 获取的数据。但是,当用户在表格视图中滚动得太快(通常在表格底部附近)时,应用程序会停止响应。
Xcode 在
中显示一个崩溃断点- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
在我分配单元格属性的那一行:
cell.name.text = [Person firstName:speaker.firstName and LastName:speaker.lastName]; (cell 是 PersonStyleCell,UITableViewCell 的子类)。
编辑
玩弄 NSManagedObject 的错误状态属性,我现在得到了错误:
CoreData could not fulfill a fault for '0x37f8f0
同样,只有当用户滚动 UITableView 太快时,应用才会崩溃。
知道应用程序崩溃的原因吗?没有内存泄漏,我只在 dealloc 方法中释放 NSFetchedResultsController 对象。可能是什么问题?
我意识到:
([(Person*)[self.personArray objectAtIndex:[indexPath row]] faultingState] == 0)
将检查存储在 NSManagedObject 中的数据是否有故障(即尚未“加载”),我认为问题在于它试图使用尚无法访问的数据设置单元格属性。
将“设置单元格属性”函数放在 if 语句中,如果数据没有错误,则仅继续设置单元格属性似乎修复了崩溃,但没有显示数据(我猜它初始化时,数据所有对象都设置为“故障”
我可以使用这个错误状态属性等到数据加载完毕后再设置单元格属性吗?如果有,怎么做?
我希望这些信息能大大简化我的问题
【问题讨论】:
是的,我相信UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];
会解决这个问题
您是否从某个 REST API 获取 Person 数组中每个 Person 的数据 - 这就是为什么需要时间才能返回的原因?
nope- 正在从 CoreData 检索数据
设法得到新的错误 - 请参阅修改后的问题
很难用这里的信息进行调试,但似乎 CoreData 中可能有一些损坏的数据?尝试在错误上设置断点以查看导致此错误的 CoreData 对象。
【参考方案1】:
您设置的批量大小是多少?我使用批量大小为 20 的大量轻量级对象遇到了这个问题。增加批量大小(对我来说是 60)可以防止崩溃,而不会对滚动性能产生任何不利影响。
【讨论】:
【参考方案2】:我不是 CoreData 专家,但我认为速度不是问题(我们在应用中使用 CoreData,但我无法滚动它)。
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html 建议您正在删除对象。您是否尝试将 CoreData 与多个线程一起使用(总是很棘手)?
如果 faultingState “有效”,那是因为如果出现错误,您将不会被完全初始化。
【讨论】:
以上是关于UITableView 在快速滚动时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableView 中快速滚动并选择单元格时,文本字段委托将 indexPath 返回为 nil 并崩溃