0

我正在使用带有 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 是数组的数据源,任何人都可以告诉我我该怎么做?

4

1 回答 1

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. 如果您对此有任何疑问,请告诉我。

于 2013-08-04T00:03:48.187 回答