0

我对 IOS 很陌生,我正在从 Web 服务获取数据。我将这些数据存储到核心数据中。目前,我正在第一个视图控制器(tableview)中加载我的所有数据。但这需要大约 10 分钟才能填满 tableview 并将所有数据存储在核心数据库中。所以我想知道最佳实践是什么。所以我想使用调度队列。但是最好的使用方法是什么?

  • 第一种方法

    1. 首先存储来自第一个视图的数据
    2. 用这些数据填充表格视图
    3. 将其余数据存储在数据库中。

但是,如果您转到下一个视图并且没有加载所有数据怎么办?

  • 第二种方法

    1. 从第一个视图存储数据
    2. 用这些数据填充表格视图?
    3. 当用户转到第二个视图时,存储第二个视图的数据
    4. 使用此数据加载第二个视图。

您始终正确存储数据,但用户仍然需要等待才能使用该应用程序。(因为没有为该视图加载数据。)

目前我正在使用第一种方法。并使用调度队列。我正在这样使用它。

- (void)fetch1:(UIManagedDocument *)document
{
    dispatch_queue_t fetchQ = dispatch_queue_create("NewsFetch", NULL);
    dispatch_async(dispatch_get_main_queue(), ^{
        //store data in core database for firstViewController and save document.
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
        [self loadFirstTableView];
        [self fetch2];
    });
    dispatch_release(fetchQ);

}
- (void)fetch2:(UIManagedDocument *)document
{
    dispatch_queue_t fetchAlbum = dispatch_queue_create("Album fetcher", NULL);
    dispatch_async(fetchAlbum, ^{
       //store data for secondViewController
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];


    dispatch_release(fetchAlbum);
}

有谁能够帮我?

亲切的问候

编辑

我如何从 web 服务获取数据的方式如下。

 NSArray *news = [GenkData getNews]; //gets all the data from webservice as JSON
        for (NSDictionary *genkInfo in news) {
            [News newsWithGenkInfo:genkInfo  inManagedObjectContext:document.managedObjectContext];
        }
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];

这就是我设置表格视图的方式。

- (void)setupFetchedResultsController // attaches an NSFetchRequest to this UITableViewController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"News"];

    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES],nil];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                managedObjectContext:self.genkDatabase.managedObjectContext
                                sectionNameKeyPath:nil
                                cacheName:nil];

}
4

1 回答 1

2

当你遇到性能问题时,你的第一反应应该是引入多线程。这增加了不应掉以轻心的额外复杂性,并且需要非常仔细地关注架构。

相反,我强烈建议您看一下 Ray Wenderlich 关于连接NSFetchedResultsControllerUITableView.

NSFetchedResultsController允许您仅加载您需要的数据,并在用户请求时自动获取批量内容。它会节省你的记忆;这将花费更少的时间;它会让您的用户满意。

在此处查看教程:http ://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller

编辑

因此,根据您的编辑,这就是我设计您的要求的方式。

  1. 您应该使用异步 HTTP 请求从 Web 服务中获取数据。使用起来很简单,NSURLRequest像这样的库AFNetworking使这变得更加容易。

  2. 既然您是从 Web 服务获取数据,那么您真的需要将该数据插入到 Core Data 中吗?更简单的方法是简单地缓存 HTTP 响应,然后直接从中加载表视图。

  3. 现在您已经有了 HTTP 响应,请告诉UITableView重新加载。当它重新加载时,您使用委托方法向它提供表数据。如果你不使用 Core Data,你就不需要再搞砸了NSFetchedResultsController

如果您的 Web 服务返回大量数据,您可能应该编写一些分页机制来批量获取结果。它会像这样工作:当用户到达表格视图的末尾时,您将发送另一个请求以获取接下来的 25 个项目。一般的经验法则:在需要之前不要获取数据。

最后,通过所有这些获取,您将想要告诉您的用户发生了什么。检查一下SVProgressHUD

希望有帮助。

于 2012-10-23T20:44:43.243 回答