如何查看哪些方法减慢了我的UIViewController的显示速度?

时间:2012-11-30 11:53:40

标签: objective-c ios xcode

我有一个非常复杂的UIViewController有时加载速度非常慢,可能需要4或5秒。

我确实使用了核心数据,我设置了-com.apple.CoreData.SQLDebug 1,并排除了加载我的数据。 CoreData: annotation: total fetch execution time: 0.0166s for 314 rows.

我确实已经将这些数据加载到UITableView中,但是只有第一个可见行得到渲染,所以无论我有多少行(当前< 500)它都不应该减慢UIView的显示速度。

我查看了仪器并检查了Time Profiler,但我没有看到一种方法来判断这个UIView中的哪个方法会很慢。

有什么建议吗?

更新
对我来说,这是由我的自定义行高引起的,所有这些都必须在显示的任何数据之前首先计算:
heightForRowAtIndexPath being called for all rows & how many rows in a UITableView before performance issues?

1 个答案:

答案 0 :(得分:2)

我最近有一个UITableViewController通过Core Data管理~8,000行。数据由NSFetchedResultsController管理;我不知道您是否将NSFetchedResultsControllerNSFetchRequest一起使用,但如果您正在展示通过核心数据填充的表格,我强烈推荐它。

也就是说,当您创建NSFetchRequest以提高获取和渲染的性能时,可以进行大量调整,这是我猜测性能瓶颈的地方。您可以获取批量行,以便快速创建表的初始渲染,并在用户滚动表时执行其他提取:

[fetchRequest setFetchBatchSize:25];

我建议阅读Apple的性能调优指南和核心数据:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html

由于您正在使用Instruments,因此还要检查(根据上述链接)Core Data缓存未命中,提取和保存。这可能会告诉你时间花在哪里。

您也可以尝试设置断点表方法,例如cellForRowAtIndexPath:,以查看加载视图时呈现的行数与用户滚动表视图时的行数。

我还设置了以下内容,这似乎可以改善我的情况:

[fetchRequest setShouldRefreshRefetchedObjects:YES];
[fetchRequest setReturnsObjectsAsFaults:NO];

Re:错误,这是Apple的NSFetchedRequest文档所说的:

  

默认值为YES。如果结果类型(请参阅resultType)是NSManagedObjectIDResultType,则不使用此设置,因为对象ID没有属性值。如果您知道需要从返回的对象访问属性值,则可以将returnsObjectsAsFaults设置为NO以获得性能优势。

核心数据可能非常复杂。如果您只是使用单个NSManagedObjectContext从她出色的iPhone开发者手册中查看Erica'Sadun的“核心数据助手”。如果您要使用Core Data做很多事情,我强烈推荐MagicalRecord,它可以处理大量合并嵌套NSManagedObjectContexts,处理多个线程等的繁重工作:{{3 }}

希望这有帮助!