我有一个带有三个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不存在,那么当然加载它。
寻找关于其他人做什么的任何指导......
布赖恩
答案 0 :(得分:0)
我会从数据库中留下查询。但是,我会对您当前正在做的事情进行2次更改:(1)我会让数据库查询处理排序(例如,“ORDER BY lastName”),以及(2)我将撤回“页面”一次数据而不是所有记录。第二个项目有一些复杂性,可以跟踪哪个页面是当前页面以及如何检索上一页和下一页,但它应该有助于提高性能。
IMO可以将大数据集一直存入内存,从而浪费电池寿命和内存。
哦,另外一件事 - 我还将数据库检索放在GCD的后台。
答案 1 :(得分:0)
对于性能问题,请实现延迟加载表视图概念。你可以在这里看到一个很好的例子:developer.apple-Sample code。
当修改某些行时,最好只修改特定的表视图单元格。你可以在不重新加载整个表的情况下完成它。
此外,您是对的,您可以使用BOOL标志来决定是否需要再次更新数据源。