gpt4 book ai didi

ios - UITableViewDataSource 异步加载

转载 作者:行者123 更新时间:2023-11-29 01:29:49 26 4
gpt4 key购买 nike

我有一个 UITableView,它应该呈现分成部分 的条目。数据需要一些时间来处理,因此它是这样完成的:

@interface AsyncTable()
NSMutableArray* _alphaKeys;
@end

@implementation AsyncTable
-(void)refreshData {
dispatch_async(_serialQueue, ^{
<load of the _alphaKeys>
dispatch_async(dispatch_get_main_queue(), ^{
[table reloadData];
});
});
}
...
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [_alphaKeys count];
}
...
@end

现在,这是第一次完美运行。

但我的数据有时会发生变化,我正在从通知中调用方法 refreshData。它开始崩溃,例如在执行时numberOfSectionsInTableView,并且在 cellForRowAtIndexPath 时,数组可能引用了不同的内容。

问题出在时间上,让我们假设 2 个调用彼此接连发生:第一个是在主线程完成加载和调度reloadData,然后第二个请求来了,在调用主线程之前开始重新加载数据...

有什么解决方法的建议吗?我不想将所有内容都放在主线程中(它有效,我现在正在尝试重构应用程序以使其更具 react 性)

最佳答案

您的问题是由在加载 tableView 的同时更新数据源 (_alphaKeys) 引起的。 UITableView 异步加载,并且无法判断何时完成。但是,如果您更改数据源并立即调用 reloadData,它会做正确的事情,即使加载正在进行中。诀窍是必须在主线程上对数据进行更改。

我的回答是更改您的代码,以便后台线程对一份数据进行处理。处理完成后,在主线程上运行一个 block ,将新数据复制到 TableView 的数据源,然后立即调用 reloadData

查看我对您的示例代码的修改:

@interface AsyncTable()
NSArray* _alphaKeys; // <-- copy for data source is immutable
@end

@implementation AsyncTable
-(void)refreshData {
dispatch_async(_serialQueue, ^{
NSMutableArray *alphaKeysCopy = [_alphaKeys mutableCopy]; // <-- Create a new array if processing does not require current state
<load of the alphaKeysCopy>
dispatch_async(dispatch_get_main_queue(), ^{
_alphaKeys = [alphaKeysCopy copy]; // <-- Copy on the main thread so the table view can't see an intermediate state
[table reloadData];
});
});
}

关于ios - UITableViewDataSource 异步加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33565561/

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