如果我有一个模型对象的NSArray,我在单元格内显示。 预先计算数据并将其作为模型中的属性更好吗?
我看到很多人这样做。所以我也跟着它。但它是否总是需要特定于某些情况?
在我当前的屏幕中,我们要为每个模型的日期属性生成一个字符串,我们使用的是NSCalendar和NSDateComponents,每次调用cellForRowAtIndexPath时都可能很重。
答案 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中异步进行计算,显示UIActivityIndicator,然后在表完成后立即填充表。