使用sqlite(FMDB)重新加载RowAtIndexPaths

时间:2013-08-03 20:57:34

标签: objective-c sqlite uitableview

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

1 个答案:

答案 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。如果您对此有任何疑问,请与我们联系。