簡體   English   中英

使用sqlite(FMDB)的reloadRowsAtIndexPaths

[英]reloadRowsAtIndexPaths with sqlite (FMDB)

我正在使用帶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是數組的數據soruce,任何人都可以告訴我我該怎么做?

您可能阻塞了主線程,從而阻止了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 如果您對此有任何疑問,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM