我的iPAD应用程序上有4个UITableView。
我使用函数loadData
在其上加载数据,该函数存在于所有4个TableViewController.m文件中,这些文件调用数据库。
所以,我会做这样的事情
[aView loadData];
[bView loadData];
[cView loadData];
[dView loadData];
其中aView,bView,cView和dView是UITableView的视图控制器。
但是,数据库调用是同步发生的,因此只有在从[aView loadData]
函数中检索数据后才会调用[bView loadData]
函数,等等。
这会影响我的表现。
我想知道是否有一种方法可以异步调用数据库/异步调用调用数据库的函数。
如果有人可以帮我解决这个问题会很棒。
答案 0 :(得分:9)
您可以使用GCD:
-(void)loadList
{
// You ma do some UI stuff
[self.activityIndicator startAnimating]; // for example if you have an UIActivityIndicator to show while loading
// Then dispatch the fetching of the data from database on a separate/paralle queue asynchronously (non-blocking)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// this is executed on the concurrent (parallel) queue, asynchronously
... do your database requests, fill the model with the data
// then update your UI content.
// *Important*: Updating the UI must *always* be done on the main thread/queue!
dispatch_sync(dispatch_get_main_queue(), ^{
[self.activityIndicator stopAnimating]; // for example
[self.tableView reloadData];
});
});
}
然后,当您调用loadList
方法时,activityIndicator将开始设置动画,并且数据的提取过程将异步启动到单独的队列中,但loadList方法将立即返回(不等待阻止dispatch_async
完成执行,这就是dispatch_async
的用途。
因此,您对每个视图控制器中的4个loadList
实现的所有调用都将立即执行(触发异步提取数据但不等待检索数据)。一旦数据库请求 - 在并行队列中执行 - 已在您的loadList
方法中完成,则执行块末尾的dispatch_sync(...)
行,询问主队列(主线程)执行一些代码来刷新UI并显示新加载的数据。