V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
DavidHu
V2EX  ›  iDev

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

  •  
  •   DavidHu · 2015-04-26 22:40:19 +08:00 · 3026 次点击
    这是一个创建于 3485 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    10 条回复    2015-05-03 22:33:34 +08:00
    juxingzhutou
        1
    juxingzhutou  
       2015-04-26 22:43:13 +08:00   ❤️ 1
    把你要在响应数据回来以后做的操作放在网络连接的回调函数里就可以了。
    DavidHu
        2
    DavidHu  
    OP
       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
        3
    11  
       2015-04-26 22:51:45 +08:00   ❤️ 1
    放回调里
    DavidHu
        4
    DavidHu  
    OP
       2015-04-26 23:01:40 +08:00
    @11 感谢。还是新人,在自行谷歌学习
    DavidHu
        5
    DavidHu  
    OP
       2015-04-26 23:01:50 +08:00
    @juxingzhutou 感谢。还是新人,在自行谷歌学习
    mofet
        6
    mofet  
       2015-04-27 11:38:02 +08:00   ❤️ 1
    如果你要开两个串行线程,最后汇总结果,那就放在回调里。线程二在线程一的回调里启动,汇总结果在线程二的回调里;
    如果涉及到数量不定的串行线程,在汇总线程里依次开线程一二三四,使用NSCondition wait,一个线程执行完成后signal开启下一个,最后返回上一级。
    如果要并行多个线程的话,那就在汇总线程里设个数量的标记位,每回来一个结果就+1,全部结果回收之后返回上一级。
    DavidHu
        7
    DavidHu  
    OP
       2015-04-27 13:25:33 +08:00
    @mofet Orz感谢,按照你说的第一个方法解决的。参考了一个英文的博客。多谢,昨晚三点多解决了,哈哈哈
    khan
        8
    khan  
       2015-04-27 18:06:35 +08:00
    多线程异步结果汇总不刚刚好是自旋锁的范畴么. 请查阅dispatch_semaphore_t
    Janselz
        9
    Janselz  
       2015-05-03 09:59:38 +08:00
    dispatch_group_notify的意思是放在Group中的Task都执行完毕,来执行dispatch_group_notify的代码
    DavidHu
        10
    DavidHu  
    OP
       2015-05-03 22:33:34 +08:00
    @Janselz OK~自己写了个回调函数,已经搞定啦~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2795 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:20 · PVG 17:20 · LAX 01:20 · JFK 04:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.