关于 iOS 开发中多线程的使用问题

2015-04-26 22:40:19 +08:00
 DavidHu

做一个登录功能,如果在请求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), ^{
// 汇总结果
});

我觉得应该是这样来实现,但是还不太具体,还请各位指点。

3067 次点击
所在节点    iDev
10 条回复
juxingzhutou
2015-04-26 22:43:13 +08:00
把你要在响应数据回来以后做的操作放在网络连接的回调函数里就可以了。
DavidHu
2015-04-26 22:51:05 +08:00
@juxingzhutou 看到AFNetWorking里面有这样一个方法,不知道用这个方法是否可以
AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
//ToDo
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
{
//ToDo
}
11
2015-04-26 22:51:45 +08:00
放回调里
DavidHu
2015-04-26 23:01:40 +08:00
@11 感谢。还是新人,在自行谷歌学习
DavidHu
2015-04-26 23:01:50 +08:00
@juxingzhutou 感谢。还是新人,在自行谷歌学习
mofet
2015-04-27 11:38:02 +08:00
如果你要开两个串行线程,最后汇总结果,那就放在回调里。线程二在线程一的回调里启动,汇总结果在线程二的回调里;
如果涉及到数量不定的串行线程,在汇总线程里依次开线程一二三四,使用NSCondition wait,一个线程执行完成后signal开启下一个,最后返回上一级。
如果要并行多个线程的话,那就在汇总线程里设个数量的标记位,每回来一个结果就+1,全部结果回收之后返回上一级。
DavidHu
2015-04-27 13:25:33 +08:00
@mofet Orz感谢,按照你说的第一个方法解决的。参考了一个英文的博客。多谢,昨晚三点多解决了,哈哈哈
khan
2015-04-27 18:06:35 +08:00
多线程异步结果汇总不刚刚好是自旋锁的范畴么. 请查阅dispatch_semaphore_t
Janselz
2015-05-03 09:59:38 +08:00
dispatch_group_notify的意思是放在Group中的Task都执行完毕,来执行dispatch_group_notify的代码
DavidHu
2015-05-03 22:33:34 +08:00
@Janselz OK~自己写了个回调函数,已经搞定啦~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/186534

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX