我是iOS的新手,我从Web服务中获取数据。我将这些数据存储到核心数据中。目前,我正在所有数据中加载第一个视图控制器(TableView)。但这大约需要10分钟才能填充表观并将所有数据存储在核心数据库中。所以我想知道最好的做法是什么。因此,我想与调度队列一起工作。但是使用它的最好方法是什么?
-
第一个方法
- First View的第一个存储数据
- 使用此数据填写TableView
- 将其余数据存储在db。 中
但是,如果您转到下一个视图,而不是所有数据都加载了?
-
第二种方法
- 从First View存储数据
- 使用此数据填写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);
}
有人可以帮助我吗?
善意
编辑
我如何从网络服务中获取数据。
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
编辑
因此,根据您的编辑,这是我设计您的要求的方式。
-
您应该使用异步HTTP请求从Web服务中获取数据。使用
NSURLRequest
和诸如AFNetworking
之类的库使它变得更加容易是微不足道的。 -
由于您从Web服务中获取数据,您是否真的需要插入该数据?简单的是简单地缓存HTTP响应,然后直接从该响应中加载表视图。
-
现在您有了HTTP响应,请告诉
UITableView
重新加载。重新加载时,您可以使用委托方法向其提供表数据。如果您不使用核心数据,则无需再与NSFetchedResultsController
混乱。
如果您的Web服务正在返回大量数据,则可能应编码一些分页机制以获取批处理。它会这样工作:当用户到达表视图的末端时,您将发送另一个请求以获取接下来的25个项目。一般的经验法则:不要获取数据之前。
最后,随着所有这些提取,您将要告诉您的用户发生了什么。查看SVProgressHUD
。
希望会有所帮助。