Ios 在CellForRowatineXpath内执行计算是否繁重?

Ios 在CellForRowatineXpath内执行计算是否繁重?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,如果我有一个显示在单元格内的模型对象数组。 预计算数据并将其作为属性保留在模型中是更好的做法吗 我看到很多人都这么做。所以我也跟着。但是,是否总是需要针对特定的情况进行调整 在我当前的屏幕中,我们将使用NSCalendar和NSDateComponents从每个模型的date属性生成一个字符串,每次调用CellForRowatineXpath时,这些组件可能会很重。CellForRowatineXpath会在每次显示或更改单元格时(通过滚动)调用,因此,这里执行的源代码不应该太多,但它取决于您的

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

我看到很多人都这么做。所以我也跟着。但是,是否总是需要针对特定的情况进行调整


在我当前的屏幕中,我们将使用NSCalendar和NSDateComponents从每个模型的date属性生成一个字符串,每次调用CellForRowatineXpath时,这些组件可能会很重。

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

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

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

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

每次显示单元格时都会调用方法,所以我会从中删除任何长时间的计算

这在很大程度上取决于你的型号

如果您使用的是CoreData,那么考虑一些临时属性是一个很好的选择,这些属性专门为表格单元格保存计算数据。NSManagedObject已经从您可以预先计算的事实中清醒过来。此外,还有更多类似于抓取的控制器和其他


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

每次显示单元格时都会调用该方法,因此我将从中删除任何长计算

这在很大程度上取决于你的型号

如果您使用的是CoreData,那么考虑一些临时属性是一个很好的选择,这些属性专门为表格单元格保存计算数据。NSManagedObject已经从您可以预先计算的事实中清醒过来。此外,还有更多类似于抓取的控制器和其他


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

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

+ (NSDateFormatter *)dateFormatter {

    static NSDateFormatter *dateFormatter = nil;

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

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

+ (NSDateFormatter *)dateFormatter {

    static NSDateFormatter *dateFormatter = nil;

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

确保每次在cellForRowAtIndexPath中计算都很繁重。了解程序精确成本的最佳方法是使用仪器。确保每次在cellForRowAtIndexPath中计算都很繁重。了解程序精确成本的最佳方法是使用仪器。操作在时间上是恒定的。只需要为日期创建一个字符串,这样就可以进行搜索。在这种情况下,如果您有所有可用的数据,我会在创建对象时之前进行计算。若您按照其他建议运行xcode探查器,您将看到“脏内存”增加并占用空间。如果可能的话,脏内存是要避免的,WWDC上有一段很好的视频解释了这一点。操作是持续的。只需要为日期创建一个字符串,这样就可以进行搜索。在这种情况下,如果您有所有可用的数据,我会在创建对象时之前进行计算。若您按照其他建议运行xcode探查器,您将看到“脏内存”增加并占用空间。如果可能的话,脏内存是要避免的,WWDC上有一个很好的视频解释了这一点。