我正在使用带有FMDB包装器的sqlite db来填充我的UITableView,我在后台制作线程,从服务器获取并更新sqlite中的数据,每次发生这种情况我都会通过通知重新加载所有UITableView,并且发生连续有20个重载数据,当发生这种情况时,滚动uitableview是不可能的,因为它被阻止连续下载,所以我的问题是如果有一种方法可以更好地重新加载uitableview,让用户滚动uitableview,我是考虑Reloadrowsatindexpaths,但如果我只重新加载一个单元格,我需要从sqlite中反映内容,因为要获取uitableview的内容我这样做:
- (void)loadTableViewInfo
{
[self.source removeAllObjects];
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open]) {
FMResultSet *sectionQuery = [db executeQuery:@"SELECT name,id,age FROM user"];
while([sectionQuery next])
{
[self.source addObject:[sectionQuery resultDictionary]];
}
}
}
soruce是数组的数据,任何人都可以告诉我我该怎么做?
答案 0 :(得分:0)
你可能在主线程上阻塞,阻止UITableView能够响应用户的交互。
快速解决方法是生成后台线程来执行查询并将数据放在self.source
中:
- (void)loadTableViewInfo {
[self performSelectorInBackground:@selector(doBackgroundQuery) withObject:nil];
}
- (void)doBackgroundQuery {
[self.source removeAllObjects];
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open]) {
FMResultSet *sectionQuery = [db executeQuery:@"SELECT name,id,age FROM user"];
while([sectionQuery next])
{
[self.source addObject:[sectionQuery resultDictionary]];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
}
}
长期解决方案是使用NSOperationQueue
。如果您对此有任何疑问,请与我们联系。