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

2015-03-18 15:31:51 +08:00
 babyname

用的 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 数组

此种情况一般怎么处理?

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

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

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

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

如果你是内部调用,那就更简单了,调用放在这个请求回调里不就可以了。

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

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

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

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

© 2021 V2EX