在我的应用程序中,我有一个UITableViewController.
它的tableView分为3个部分.
我从我的服务器下载每个部分的数据.为此,我有3个函数(例如f1 f2和f3).每个都更新一个相应的NSArray,用作我的表的数据源.
现在我想要的是使用这个函数重新加载数据,并在完成这3个功能后刷新我的tableView,但不会打扰用户.
我没有使用异步请求,块,线程等…而且我正在寻找提示.
实际上,这就是我所做的:
-(void)viewDidLoad { //some settings [NSTimer scheduledTimerWithTimeInterval:15.0 target:self selector:@selector(reloadDatas) userInfo:nil repeats:YES]; dispatch_queue_t queue = dispatch_get_main_queue(); dispatch_async(queue,^{ [self reloadDatas]; }); } -(void)reloadDatas { dispatch_queue_t concurrentQueue = dispatch_get_main_queue(); dispatch_async(concurrentQueue,^{ [self f1]; [self f2]; [self f3]; [myDisplayedTable reloadData]; }); } -(void)f1 { //load datas with a url request and update array1 } -(void)f2 { //load datas with a url request and update array2 } -(void)f3 { //load datas with a url request and update array3 }
但是在这里,我的tableView被“冻结”,直到它被刷新.
我不关心f1 f2和f3的执行顺序,但我需要等待刷新tableView之前完成这三个函数.
谢谢你的帮助.
编辑
谢谢你的所有答案.
这是工作解决方案:
作为mros的建议,我从viewDidLoad中删除了调度队列,并在reloadDatas中替换:
dispatch_queue_t concurrentQueue = dispatch_get_main_queue();
同
dispatch_queue_t mainThreadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
最后,我在一个主线程中重新加载我的表
dispatch_async(dispatch_get_main_queue(),^{ [myDisplayedTable reloadData]; });
解决方法
所以你的“后台线程”实际上是你的主线程.您必须使用dispatch_get_global_queue并指定实际获得不同线程的优先级.此外,viewDidLoad中的dispatch async是无用的,因为在主线程中调用所有视图控制器生命周期方法.我建议你在f1,f2和f3方法中做如下的事情:
首先启动异步URL请求,然后在完成块中更新arrayX并重新加载tableview的特定部分.这样,所有三个请求都可以同时发生,并且表只是在每个请求完成时更新必要的数据.或者,如果您只想重新加载一次,只需用后台线程替换concurrentQueue变量,然后在主线程上执行[tableView reloadData].