繁体   English   中英

使用Objective-c中的调度队列

[英]Working with dispatch queues in Objective-c

我是IOS的新手,我从网络服务获取数据。 这个数据存储在核心数据中。 目前,我正在第一个视图控制器(tableview)中加载我的所有数据。 但这需要大约10分钟来填充tableview并将所有数据存储在核心数据库中。 所以我想知道最佳做法是什么。 所以我想使用调度队列。 但是使用它的最佳方法是什么?

  • 第一种方法

    1. 首先从第一个视图存储数据
    2. 使用此数据填写tableview
    3. 在db中存储其余数据。

但是如果你转到下一个视图而不是所有数据都被加载呢?

  • 第二种方法

    1. 从第一个视图存储数据
    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);
}

有谁能够帮助我?

亲切的问候

编辑

我如何从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];

这就是我设置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];

}

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

相反,我会强烈建议你看看雷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

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM