每次打开iOS TableView时如何不从SQLite重新加载NSMutableArray

时间:2014-01-22 21:00:36

标签: ios objective-c fmdb

我有一个带有三个SQLite数据库的iOS应用程序,我从Web服务加载。

当我打开其中一个dbs的TableView时,我将数据加载到NSMutableArray中并将其用作数据源。

以下是员工View ...的viewDidLoad

- (void)viewDidLoad
{

    [super viewDidLoad];

    //Get array of employees and sections
    _locations = [LocationDatabase getLocations];
    self.sections = [LocationDatabase getSections:_locations];

    //Set up Search
    self.searchDisplayController.displaysSearchBarInNavigationBar = YES;
    self.filteredLocations = [NSMutableArray array];
    searchController.delegate = self;
    searchController.searchResultsDataSource = self;
    isSearching = FALSE;

    //iPad
    //self.dtailViewController = (detailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];

    //Set the back bar button
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Locations" style:UIBarButtonItemStylePlain target:nil action:nil];
    self.navigationItem.backBarButtonItem = backButton;
}

及其调用的方法......

+ (NSMutableArray *) getEmployees

{

    id tmpDatabasePath = [(AppDelegate *)[[UIApplication sharedApplication] delegate] databasePath];
    NSMutableArray *tmpEmployees;
    tmpEmployees = [[NSMutableArray alloc] init];

    FMDatabase *db = [FMDatabase databaseWithPath:tmpDatabasePath];
    [db open];
    FMResultSet *results = [db executeQuery:@"SELECT * FROM employees"];
    while([results next])
    {
        employee *thisEmployee      = [employee new];
        thisEmployee.firstName      = [results stringForColumn:@"firstName"];
        thisEmployee.lastName       = [results stringForColumn:@"lastName"];
        thisEmployee.fullName       = [results stringForColumn:@"fullname"];
        thisEmployee.city           = [results stringForColumn:@"city"];
        thisEmployee.ste            = [results stringForColumn:@"state"];
        thisEmployee.emailAddress   = [results stringForColumn:@"email"];

        NSString *tst = [results stringForColumn:@"id"];
        thisEmployee.id    = [NSNumber numberWithInt:[tst intValue]];
        [tmpEmployees addObject:thisEmployee];
    }
    [db close];

    //Sort by Last Name
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName"
                                                                  ascending:YES];
    NSMutableArray *sortDescriptors = [NSMutableArray arrayWithObject:sortDescriptor];
    tmpEmployees = [[tmpEmployees sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];

    return tmpEmployees;
}

这一切都很好,我很高兴。问题是我的一个数据库较大,其中有1或2个k项,因此负载有点慢。用户存在明显的延迟。只是一次又一次地加载这个NSMutableArray似乎很愚蠢。用户无法更改数据,也不会经常更新。

我想知道这里有什么最佳做法。我的想法是为NSUserDefaults中的每个数据库设置一个值,以便在上次更新数据库时使用。我为每个数据库集提供了后台提取,因此我每次都可以更新该标志。然后,当我加载视图时,我首先检查我的标志是否已设置(即数据已更新),如果是,则加载NSMutableArray,如果没有抓取现有数组。如果NSMutable Array不存在,那么当然加载它。

寻找关于其他人做什么的任何指导......

布赖恩

2 个答案:

答案 0 :(得分:0)

我会从数据库中留下查询。但是,我会对您当前正在做的事情进行2次更改:(1)我会让数据库查询处理排序(例如,“ORDER BY lastName”),以及(2)我将撤回“页面”一次数据而不是所有记录。第二个项目有一些复杂性,可以跟踪哪个页面是当前页面以及如何检索上一页和下一页,但它应该有助于提高性能。

IMO可以将大数据集一直存入内存,从而浪费电池寿命和内存。

哦,另外一件事 - 我还将数据库检索放在GCD的后台。

答案 1 :(得分:0)

对于性能问题,请实现延迟加载表视图概念。你可以在这里看到一个很好的例子:developer.apple-Sample code

当修改某些行时,最好只修改特定的表视图单元格。你可以在不重新加载整个表的情况下完成它。

此外,您是对的,您可以使用BOOL标志来决定是否需要再次更新数据源。