2016-07-14 3 views
0

Alamofire 멀티 태스크를 사용하면 하나의 func 후에 실행. 내 사용 gcd, NSOperationQueue 모두 실패했습니다. 마스터 해결을 도와주세요.Alamofire 멀티 태스킹 하나의 func 후에 실행

다음 의사 코드 : 이러한 접근 방식 모두

let imgDatas1 = UIImageJPEGRepresentation(UIImage(named: "aar")!, 0.1) 
let strUrl1 = "http://www.baidu.com" 


    let group = dispatch_group_create() 
    let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    //let queue = dispatch_get_main_queue() 

    dispatch_group_async(group, queue) { 
     print("threed 1.1") 
     Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in 
      NSThread.sleepForTimeInterval(3.0) 
      print("threed1.3") 
     }) 
     print("threed1.2") 
    } 
    dispatch_group_async(group, queue) { 
     print("threed2.1") 
     Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in 
      NSThread.sleepForTimeInterval(2.0) 
      print("threed2.3") 
     }) 

     print("threed2.2") 
    } 

    dispatch_group_notify(group, queue) { 
     print("voer") 
    } 





    let operationQueue = NSOperationQueue() 
    let operation1 = NSBlockOperation { 
     Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in 
      NSThread.sleepForTimeInterval(2.0) 
      print("xian 1.2") 
     }) 
     print("xian 1.1") 

    } 
    let operation2 = NSBlockOperation { 
     Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in 
      NSThread.sleepForTimeInterval(3.0) 
      print("xian 2.2") 
     }) 
     print("xian 2.1") 
    } 
    let operation3 = NSBlockOperation { 
     print("xian 3") 
    } 
    operation2.addDependency(operation1) 
    operation3.addDependency(operation2) 

    operationQueue.addOperation(operation1) 
    operationQueue.addOperation(operation2) 
    operationQueue.addOperation(operation3) 

답변

0

문제는 당신이 요청의 실제 응답을 요청의 발행을 동기화하지만,하지 않을 것입니다. 귀하의 GCD 예에서는 응답이 아직 접수되지 않았더라도 요청이 발행되는 즉시 귀하의 dispatch_group_async을 종료합니다. 마찬가지로 작업 대기열 예제에서 요청이 발행되는 즉시 블록 작업을 완료하지만 이러한 작업은 요청이 완료 될 때까지 기다리지 않습니다.

단순한 방법은 이전 방법의 완료 처리기에서 하나를 호출하는 것입니다. 별도의 함수에 넣으면 완료 핸들러가 깔끔하게 중첩되지 않습니다.

좀 더 우아한 해결책을 찾고 있다면, 당신은 비동기 NSOperation/ Operation 하위 클래스에서이 포장에 의해 작동 큐와 함께이 문제를 해결하고, 요청이 완료되면에만 isFinished KVO를 트리거합니다. 비동기식 대 동기식 조작 섹션 Operation Reference을 참조하거나 동시성 프로그래밍 안내서의 Operation Queues: Concurrent Versus Non-concurrent Operations에있는 약간 더 상세한 (그러나 날짜가 지정된) 토론을 참조하십시오.

또 다른 멋진 접근 방식은 PromiseKit과 같은 약속을 사용하는 것입니다. 그것은 아주 드라마틱 한 해결책 (완전히 새로운 비동기 패턴을 소개 함)으로 나를 공격하지만, 이런 종류의 문제를 잘 해결합니다.