AFNetworking 阻止 UI

AFNetworking Block the UI

我正在使用 AFNetworking 从服务器请求数据,如果网络连接不好,接收数据需要很长时间,所以如果我不想等待并决定返回,它将不允许我(阻止 UI),如果我不想等待数据加载,我应该怎么做才能返回。

下面是我用于 API 调用的代码:

class func  performHTTPGetOnUrl(url: NSString , withParams dictionary: NSMutableDictionary? , withDelegate delegate:ConnectionManagerDelegate)
{
    print("url is \(url) & params are \(dictionary)")
    let manager = AFHTTPRequestOperationManager()
    manager.requestSerializer = AFJSONRequestSerializer(writingOptions: []) //1
    manager.responseSerializer = AFJSONResponseSerializer() //2
    manager.responseSerializer.acceptableContentTypes = NSSet(objects: "application/json") as Set<NSObject>
    manager.responseSerializer.acceptableContentTypes = NSSet(array: ["text/plain", "text/html", "application/json"]) as Set<NSObject>

    //3

    manager.GET(url as String,
        parameters: dictionary,
        success: {(operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in

            print("inside connectionManager success")

            delegate.requestSucceededWithJsonResponse(responseObject!)
        },
        failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in
            print("inside failure block of get ")
            delegate.requestFailedWithError(error!)
    })


}

不确定是什么阻止了 UI 查看此代码,因为这些方法(应该)已经异步了...您是否有一些调用此代码的东西会阻塞,直到此 web 服务调用完成?否则尝试将整个事情包装在一个调度队列中,如

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
 // do stuff
});

如果有 ui 更新

,你的委托回调应该返回到主线程
dispatch_sync(dispatch_get_main_queue(), {
    delegate.requestSucceededWithJsonResponse(responseObject!)
});

所有 UI 更新 必须在主线程中完成。您可以检查您的当前流程是否在主线程上,并决定在必要时调用 dispatch_get_main_queue

if NSThread.isMainThread() {
   print("this flow is in the main thread..")
} else {
   print("warning, this is not the main thread..")
   // apply your dispatch_get_main_queue..
}

您可以为您的请求添加时间间隔。如果在该时间间隔内未收到响应,则请求将被取消。使用以下代码添加请求的时间间隔。

[manager.requestSerializer setTimeoutInterval:30];