1

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

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

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

4

4 回答 4

4

日期格式化通常被认为是一个昂贵的过程(文档阅读:Cache Formatters for Efficiency)。对于这些类型的对象,初始化和缓存单个实例远远优于在每次调用cellForRowAtIndexPath. 这适用于 NSCalenders 和 NSDateformatters 等。只要您只创建日期格式对象的单个实例,那么在其中使用它们cellForRowAtIndexPath应该不会对性能造成明显影响。尝试将这些对象缓存在单元格或 tableview 委托的类方法中,如下所示:

+ (NSDateFormatter *)dateFormatter {

    static NSDateFormatter *dateFormatter = nil;

    if(!dateFormatter) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"EEEE LLL d, yyyy | h:mma"];
    }
    return dateFormatter;
} 
于 2013-07-30T14:23:11.957 回答
1

cellForRowAtIndexPath每次显示或更改单元格时都会调用(通过滚动),因此此处执行的源不应太多,但这取决于您的数据。如果您必须在加载时间增加并且您的设备内存不足之前携带大量数据并准备所有数据。

于 2013-07-30T14:07:03.873 回答
1

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

于 2013-07-30T14:12:23.633 回答
1

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

很大程度上取决于您的型号。

如果您使用的是 CoreData,那么考虑一些专门为表格单元格保存计算数据的瞬态属性是一个不错的选择。NSManagedObject 有 awakeFromFecth 是你可以预先计算的东西。此外,还有更多类似 fetched 控制器等。

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

于 2013-07-30T14:19:35.137 回答