【发布时间】:2018-02-19 16:08:37
【问题描述】:
我正在使用 iOS Swift 应用程序,我正在尝试获取网站的内容。问题是,当我运行代码时,响应对象是在执行其他行之后返回的。
我有这个:
public var response: Array<Any>?
public func myRequest(completion: @escaping (_ json: Any?, _ error: Error?)->()) {
var request = URLRequest(url: self.url)
request.httpBody = postString.data(using: .utf8)
let t = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data,
error == nil else {
completion(nil, error)
return
}
let json = try? JSONSerialization.jsonObject(with: data, options: [])
if let dictionary = json as? [String : Any] {
if (dictionary["ok"] as? String == "true") {
self.response = dictionary["users"] as? Array<Any>
}
}
completion(json, error)
}
t.resume()
}
然后:
func foo() {
myRequest() { json, error in
print(json)
}
print("I'm here!")
}
我得到了这个:
I'm here
{...} //JSON
问题是:为什么我在JSON 之前检索I'm here?我该如何解决?
【问题讨论】:
-
请,请,请不要那样做。使用某种完成处理程序。
-
永远不要不要在这种情况下使用“睡眠”。不要等。使用回调。这是你应该做什么的一个例子:stackoverflow.com/a/37343547/2227743 另一个:stackoverflow.com/a/31264556/2227743 关于这个问题还有很多很多其他的现有答案。搜索“回调”、“异步”和“完成处理程序”。
-
@the4kman 我知道这是一件坏事事实上我的问题是:“我怎么能不使用 sleep()?”
标签: swift nsurlsession nsurlrequest