[英]Working with dispatch queues in Objective-c
我是IOS的新手,我从网络服务获取数据。 这个数据存储在核心数据中。 目前,我正在第一个视图控制器(tableview)中加载我的所有数据。 但这需要大约10分钟来填充tableview并将所有数据存储在核心数据库中。 所以我想知道最佳做法是什么。 所以我想使用调度队列。 但是使用它的最佳方法是什么?
第一种方法
但是如果你转到下一个视图而不是所有数据都被加载呢?
第二种方法
您始终正确存储数据,但用户仍需要等待它才能使用该应用程序。 (因为没有为该视图加载数据。)
目前我正在使用第一种方法。 并使用调度队列。 我这样用它。
- (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的优秀教程的连接最多NSFetchedResultsController
到UITableView
。
NSFetchedResultsController
允许您仅加载所需的数据,并在用户请求时自动获取批量内容。 它会节省你的记忆; 这将花费更少的时间; 它会让你的用户满意。
查看教程: http : //www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller
编辑
因此,根据您的编辑,这是我如何设计您的要求。
您应该使用异步HTTP请求从Web服务获取数据。 使用NSURLRequest
这很简单,像AFNetworking
这样的库使这更容易。
由于您从Web服务获取数据,您是否真的需要将该数据插入Core Data? 更简单的是简单地缓存HTTP响应,然后直接从中加载表视图。
现在您已获得HTTP响应,请告知UITableView
重新加载。 重新加载时,使用委托方法向其提供表数据。 如果您不使用Core Data,则不再需要使用NSFetchedResultsController
。
如果您的Web服务正在返回大量数据,您应该编写一些分页机制来批量获取结果。 它的工作方式如下:当用户到达表视图的末尾时,您将发送另一个请求来获取接下来的25个项目。 一般经验法则:在需要之前不要获取数据。
最后,通过所有这些提取,您将要告诉您的用户发生了什么。 检查SVProgressHUD
。
希望有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.