gpt4 book ai didi

iphone - UITableView上的GCD实现

转载 作者:行者123 更新时间:2023-12-01 17:23:55 26 4
gpt4 key购买 nike

创建单元格时,我正在做一些繁重的计算。我试图找出使UITableView保持流畅的最佳方法,但是在相同类型的情况下,后台进行计算(保持UI线程无需过多处理)。

仅出于测试目的,我将此作为繁重的计算方法:

+(NSString*)bigCalculation
{
int finalValue=0;
int j=0;
int i=0;

for (i=0; i<1000; i++) {
for (j=0; j<10000000; j++) {
j++;
}
finalValue+=j/100*i;
}

return [NSString stringWithFormat:@"%d",finalValue];
}

在cellForRowAtIndexPath内部,我仅执行以下操作:
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *identifier=@"identifier";

UITableViewCell *cell=nil;
cell=[aTableView dequeueReusableCellWithIdentifier:identifier];
if(!cell)
{
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
}

NSString *text=[dataSource objectForKey:[[dataSource allKeys] objectAtIndex:indexPath.row]];


dispatch_queue_t a_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
;
dispatch_async(a_queue, ^{

NSString *subtitle=[CalculationEngine bigCalculation];
dispatch_async(dispatch_get_main_queue(), ^{
[[cell detailTextLabel] setText:subtitle];
dispatch_release(a_queue);
});
});


[[cell textLabel] setText:text];
return cell;
}

目前,我有UITableView流体,而在后台一切正常。所以我的问题是:

1)这是实现我想要的最好的方法吗,KVO也是答案吗?

2)之前,请执行以下操作:
dispatch_queue_t a_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

我在做:
dispatch_queue_create("com.mydomain.app.newimagesinbackground", DISPATCH_QUEUE_SERIAL)

而且性能很差。你能解释一下为什么吗?

最佳答案

这不是一个好方法。您正在通过将计算工作插入 View Controller 来破坏MVC。您应该将数据保存在模型对象中,并在那里管理计算。然后,表格 View 应仅在数据更改时使用reloadRowsAtIndexPaths:withRowAnimation:显示模型的当前值。 KVO是确定数据何时更改的一种合理方法。

如果您想懒于计算,则可以像recalculateIfNeeded这样对模型进行调用,以使模型知道某人(在这种情况下为表 View )想要一个新值。但是,如果输入数据没有实际更改,则不应重新计算。该模型是跟踪数据是否已更改的地方。

关于iphone - UITableView上的GCD实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10110884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com