MENU

使用 Alamofire 执行同步请求

November 26, 2015 • Read: 3835 • Codes

刚学 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 上, (bu) () () 的可以 (zuō) () 一下~

<div class="github-widget" data-repo="Dalodd/Alamofire-Synchronous"></div>

Archives QR Code Tip
QR Code for this page
Tipping QR Code