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];
我正在使用 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];