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
babyname
V2EX  ›  iDev

如何确保相关方法在 HTTP 请求内容结束后才调用?

  •  
  •   babyname · 2015-03-18 15:31:51 +08:00 · 2656 次点击
    这是一个创建于 3573 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用的 Alamofire

    var pageData = [Item]()
    
    func get(url: String) {
        Alamofire
            .request(.GET, url, parameters: nil)
            .responseJSON { (request, response, data, error) in
                if error == nil {
                    var jsonData = JSON(data!)
    
                    for (key: String, json: JSON) in jsonData {
                        let item = Item.createItemWidthJsonData(json["title"].stringValue, image: json["image"].stringValue, text: json["text"].stringValue)
                        self.pageData.append(item)
                    }
                }
        }
    }
    

    请求结束后填充 pageData 数组

    可不等请求结束,系统就要调用其他方法,其他方法依赖 pageData 数组

    此种情况一般怎么处理?

    11 条回复    2015-03-20 14:36:16 +08:00
    fatea
        1
    fatea  
       2015-03-18 20:25:35 +08:00 via iPhone
    同问...
    oIIo
        2
    oIIo  
       2015-03-18 20:54:27 +08:00
    把这个线程先挂起,得到响应后在继续。 这是什么语言?
    oIIo
        3
    oIIo  
       2015-03-18 20:58:19 +08:00
    swift里面有没有类似 event 的机制呀? 好像Objective-c 有个什么 Notification 之类的类,可以用了通知事件。
    123123
        4
    123123  
       2015-03-18 21:58:27 +08:00
    加个锁,调用其他方法检查锁等待数据
    alangz
        5
    alangz  
       2015-03-18 22:10:16 +08:00
    这是go语言吧,这种情况个人认为系统可以先调用其他方法继续执行,在执行到需要pageData数组的地方挂起线程,等待pageData数组填充完成之后通知上一个线程继续执行。
    ETiV
        6
    ETiV  
       2015-03-18 22:12:28 +08:00 via iPhone
    这不就是JS的异步嘛。

    看着像是个http请求的框架,把有依赖关系的“其他方法”拿出来,放到responseJSON内部的末尾。

    iOS更新UI需要在主线程,写回调函数的时候注意到这点就可以了。
    keithellis
        7
    keithellis  
       2015-03-19 10:22:33 +08:00
    NSOperation addDependency(_ operation: NSOperation)
    GCD dispatch_group
    knightlhs
        8
    knightlhs  
       2015-03-19 20:11:10 +08:00
    go 语言的话 开个 chan 然后等待 由于 chan 是阻塞的 所以后面的代码无法继续只有等 chan 完成
    很简单的
    dorentus
        9
    dorentus  
       2015-03-19 21:15:00 +08:00 via iPad
    var pageData: [Item] = [] {
    didSet {
    // blahblah
    }
    }
    babyname
        10
    babyname  
    OP
       2015-03-20 08:58:32 +08:00
    @alanlhy
    @oIIo
    @dorentus
    @knightlhs
    @ETiV
    @oIIo

    谢谢,这是 Swift Lang,最后用 协议 搞好了。
    vincentxue
        11
    vincentxue  
       2015-03-20 14:36:16 +08:00   ❤️ 1
    对 iOS 开发来说,你这种情况用锁或者依赖都不太适合,如果你是请求数据然后完成展示了才能操作,那你就应该挂个HUD,等数据请求完成,展示出来之后再关掉这个HUD,现在才允许用户做操作。

    如果你是内部调用,那就更简单了,调用放在这个请求回调里不就可以了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2657 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:27 · PVG 14:27 · LAX 22:27 · JFK 01:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.