与Objective-C中的调度队列一起工作



我是iOS的新手,我从Web服务中获取数据。我将这些数据存储到核心数据中。目前,我正在所有数据中加载第一个视图控制器(TableView)。但这大约需要10分钟才能填充表观并将所有数据存储在核心数据库中。所以我想知道最好的做法是什么。因此,我想与调度队列一起工作。但是使用它的最好方法是什么?

  • 第一个方法

    1. First View的第一个存储数据
    2. 使用此数据填写TableView
    3. 将其余数据存储在db。

但是,如果您转到下一个视图,而不是所有数据都加载了?

  • 第二种方法

    1. 从First View存储数据
    2. 使用此数据填写TableView?
    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);
}

有人可以帮助我吗?

善意

编辑

我如何从网络服务中获取数据。

 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];

这就是我设置tableview的方式。

- (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];
}

遇到性能问题时,您的第一个反应应不是是介绍多线程。这增加了不应轻易采取的额外复杂性,需要非常谨慎地关注建筑。

相反,我强烈建议您看一下Ray Wenderlich关于将NSFetchedResultsController连接到UITableView的出色教程。

NSFetchedResultsController允许您仅加载所需的数据,并在用户请求时自动获取内容批次。它可以节省您的内存;这将花费更少的时间;它会让您的用户开心。

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

编辑

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

  1. 您应该使用异步HTTP请求从Web服务中获取数据。使用NSURLRequest和诸如AFNetworking之类的库使它变得更加容易是微不足道的。

  2. 由于您从Web服务中获取数据,您是否真的需要插入该数据?简单的是简单地缓存HTTP响应,然后直接从该响应中加载表视图。

  3. 现在您有了HTTP响应,请告诉UITableView重新加载。重新加载时,您可以使用委托方法向其提供表数据。如果您不使用核心数据,则无需再与NSFetchedResultsController混乱。

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

最后,随着所有这些提取,您将要告诉您的用户发生了什么。查看SVProgressHUD

希望会有所帮助。

最新更新