在cellForRowAtIndexPath中执行计算是否很重?

时间:2013-07-30 14:01:55

标签: ios objective-c uitableview

如果我有一个模型对象的NSArray,我在单元格内显示。 预先计算数据并将其作为模型中的属性更好吗?

我看到很多人这样做。所以我也跟着它。但它是否总是需要特定于某些情况?

在我当前的屏幕中,我们要为每个模型的日期属性生成一个字符串,我们使用的是NSCalendar和NSDateComponents,每次调用cellForRowAtIndexPath时都可能很重。

4 个答案:

答案 0 :(得分:4)

日期格式通常被认为是一个代价高昂的过程(docs读取:缓存格式化效率)。对于这些类型的对象,初始化和缓存单个实例远远优于在每次调用cellForRowAtIndexPath时创建新实例。这适用于NSCalenders和NSDateformatters等。只要您只创建日期格式化对象的单个实例,那么在cellForRowAtIndexPath中使用它们不应该在性能上有明显的影响。尝试在您的单元格或类视图的委托上的类方法中缓存这些对象,如下所示:

+ (NSDateFormatter *)dateFormatter {

    static NSDateFormatter *dateFormatter = nil;

    if(!dateFormatter) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"EEEE LLL d, yyyy | h:mma"];
    }
    return dateFormatter;
} 

答案 1 :(得分:1)

每次显示或更改单元格时(通过滚动)都会调用

cellForRowAtIndexPath,因此此处执行的源不应太多,但这取决于您的数据。如果您必须携带大量数据并准备好所有数据,那么加载时间将会增加并且您的设备内存不足。

答案 2 :(得分:1)

此方法的文档指出,出于性能原因,您通常会重新使用单元格。所以你可以假设它被反复调用。

答案 3 :(得分:1)

每次显示一个单元格时都会调用这些方法,因此我会从那里删除任何长计算。

很大程度上取决于你的模特。

如果您正在使用CoreData,那么考虑一些特定于Table Cell的计算数据的瞬态属性是一个不错的选择。 NSManagedObject有awakeFromFecth你可以预先计算事物。此外,更像是取得控制器和其他部分。

如果你没有使用CoreData,我会尝试实现相同的机制,或者它的重要部分,但我读到你已经在做了。您可以在NSOperation中异步进行计算,显示UIActivityIndi​​cator,然后在表完成后立即填充表。