刚学 Swift,之前写了点小东西玩,用到了 Alamofire,然而当时的需求是先请求一个 URL,然后根据获取到的数据再执行操作,而且再需要一个请求,本来这样也没什么,就是代码嵌套起来不是很好看罢了,然而后面发现居然是个循环。。。做完以后再重来的那样。智商捉鸡的我当时就蒙逼了,想了想还是觉得用同步请求也许会更好点。。
于是抓紧看源码,看了半年发现 Alamofire 用的是 NSURLSession,而这货貌似本来就不能执行同步请求。。。好吧。。只能从想想其他办法了。。
恩。最后终于找到了一种解决方案,用semaphore
,代码大概如下:
public func responseJSON(options options: NSJSONReadingOptions = .AllowFragments) -> Response<AnyObject, NSError> {
let semaphore = dispatch_semaphore_create(0)
var result: Response<AnyObject, NSError>!
self.responseJSON(queue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), options: options, completionHandler: {response in
result = response
dispatch_semaphore_signal(semaphore);
})
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
return result
}
Usage
let response = Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]).responseJSON()
if let json = response.result.value {
print(json)
}
不过这样的话是不能在主线程(main_queue)中使用的,但是,大概应该也许不会有这种需求吧。。。
简单封装一下扔到了 github 上,有需要的可以尝试一下~