做一个登录功能,如果在请求API的部分用了异步(NSURLConnection sendAsynchronousRequest)的方法去请求,那么不管反不返回数据都会直接跳转回上一个界面。但是我想在验证登录的同时不阻塞主线程,又能执行一个spinner。然后再数据请求回来以后再继续,比如不通过就提示,通过就返回上一级这样的。(这部分完事了)
重点就是如何多线程,然后再判断结果前还能等待结果。
唐巧老师的书里在介绍GCD的时候提到一个高级用法
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程一
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 汇总结果
});
我觉得应该是这样来实现,但是还不太具体,还请各位指点。
1
juxingzhutou 2015-04-26 22:43:13 +08:00 1
把你要在响应数据回来以后做的操作放在网络连接的回调函数里就可以了。
|
2
DavidHu OP @juxingzhutou 看到AFNetWorking里面有这样一个方法,不知道用这个方法是否可以
AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { //ToDo } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { //ToDo } |
3
11 2015-04-26 22:51:45 +08:00 1
放回调里
|
5
DavidHu OP @juxingzhutou 感谢。还是新人,在自行谷歌学习
|
6
mofet 2015-04-27 11:38:02 +08:00 1
如果你要开两个串行线程,最后汇总结果,那就放在回调里。线程二在线程一的回调里启动,汇总结果在线程二的回调里;
如果涉及到数量不定的串行线程,在汇总线程里依次开线程一二三四,使用NSCondition wait,一个线程执行完成后signal开启下一个,最后返回上一级。 如果要并行多个线程的话,那就在汇总线程里设个数量的标记位,每回来一个结果就+1,全部结果回收之后返回上一级。 |
8
khan 2015-04-27 18:06:35 +08:00
多线程异步结果汇总不刚刚好是自旋锁的范畴么. 请查阅dispatch_semaphore_t
|
9
Janselz 2015-05-03 09:59:38 +08:00
dispatch_group_notify的意思是放在Group中的Task都执行完毕,来执行dispatch_group_notify的代码
|