0

我正在开发一个允许用户浏览/搜索书籍并下载它们的应用程序。有3个UITableView,下载/搜索/浏览

如果未下载,我想显示“下载”按钮,否则显示“打开”按钮。在下载表格视图中很简单,我只是从核心数据中查询并显示所有书籍。

服务器是无状态的,不知道用户是否下载了这本书。

我将下载的书籍保存在核心数据中。使用 FetchedResultsController 下载表格视图。

当用户按类别搜索/浏览时,开始一个新的 REST 请求并使用响应的 JSON 作为内存 NSArray 来备份 tableview 以显示标题和作者姓名等。

图书列表很大,服务器支持一些高级搜索,例如使用 Acronym 和按受欢迎程度排序。所以下载整个列表并在本地执行搜索需要更多的工作。

什么是更新确定是否在搜索视图中下载书籍的好方法?每次cellForRowAtIndexPath在主线程中查询核心数据库听起来很昂贵。我还想在后台下载完成时实时更新UI状态,所以下载后修改JSON也不起作用

谢谢

4

2 回答 2

1

如果书籍列表很小(足够小以至于您可以一次从服务器下载它),您可能会在内存中为其构建模型而侥幸。尝试查询服务器,使用 CoreData 结果修改响应(全部在后台),然后告诉UITableView重新加载自身(在 UI 线程中)。

伪代码来说明:

dispatch_async(..., ^{
  [server requestData:param onComplete:^(NSDictionary* result){
    NSArray* someResult = [moc executeFetchRequest:...];
    NSArray* tableViewData = [mybusinesslogic mergeServerResult:result 
                              withCoreDataResult:someResult];
    myTableViewController.tableViewData = tableViewData;
    dispatch_async(dispatch_get_main_queue(), ^{
      [myTableViewController.tableView reloadData];
    });
  }];
});
于 2013-02-04T01:51:36.343 回答
0

对每个单元进行核心数据查询是昂贵的。所以做一个查询,然后在内存中匹配它。如果书籍有某种易于匹配的 ID。也许是这样的:

1) 获取响应的 JSON NSArray。(也许将 id 解析到另一个 NSArray 中) 2)在单个查询中将其中的 id 与 Core Data 中的 id 匹配。返回仅具有匹配 id 的数组,如下所示:

-(NSArray*) findMatchInGraph:(NSManagedObjectContext*)context forResults:(NSArray*)searchResultIDs {

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity: [NSEntityDescription entityForName:@"Books" inManagedObjectContext:context]];

    NSPredicate *reqPredicate = [NSPredicate predicateWithFormat:@"(id IN %@)", searchResults;
    [request setPredicate:reqPredicate];

    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSMutableArray *matching = [NSMutableArray array];
    if (results) {
        for (NSManagedObject *item in results) {
            [matching addObject:[item valueForKey:@"id"]];
        }
    }
    return [matching copy];
}

3) TableViewController,具有匹配 ID 的索引单元格将添加“已下载”指示符?

也许有一种更有效的方法来做到这一点。

于 2013-02-04T14:52:01.340 回答