2016-06-08 2 views
1

AFNetworking을 사용하여 서버의 데이터를 요청합니다. 인터넷 연결이 안되면 데이터를받는 데 오랜 시간이 걸릴 수 있습니다. 따라서 기다릴 필요가 없으며 돌아 가기로 결정한 경우, 그것은 나를 허용하지 않을 것입니다 (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!) 
    }) 


} 
+0

메인 대기열이 아닌 dispatch_async 대기열에서 실행하십시오. 완료 후 메인 큐의 데이터를 업데이트하십시오. –

+1

이 코드는 이미 비동기입니다. 그것은 아무것도 막지 않을 것이다. – Paulw11

+0

당신은 dispatch_async 큐 @sharad chauhan을 사용할 때 간단한 코드를 제공 할 수 있습니까? –

답변

1

하지 이미 (해야)하는 방법 때문에, UI가이 코드를보고 비동기 차단 될 수 무엇인지 ... 당신을 이 webservice 호출이 끝날 때까지이 코드를 호출하는 코드가 있습니까? UI 업데이트

dispatch_sync(dispatch_get_main_queue(), { 
    delegate.requestSucceededWithJsonResponse(responseObject!) 
}); 
1

이이 있어야합니다 귀하의 모든 UI 업데이트가있는 경우 메인 스레드에 다시 가야하지만 그렇지

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

대리자 콜백처럼 디스패치 큐에 모든 것을 감싸 시도 주 스레드에서 완료되었습니다. 당신은 당신의 전류 흐름이 조건으로 메인 스레드에 있는지 확인하고 필요의 경우 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.. 
} 
0

당신은 당신의 요청에 대한 시간 간격을 추가 할 수 있습니다. 해당 시간 간격에 응답이 없으면 요청이 취소됩니다. 요청할 시간 간격을 추가하려면 아래 코드를 사용하십시오.

[manager.requestSerializer setTimeoutInterval:30];