2016-07-19 12 views
0

これは私のコードが今見ているところです。私はスレッドを起動しようとしていますが、私のコードは再帰的なサイクルになります。私はあなたからエラーの理由を得るか、この状況で非常に便利な素晴らしいJava Thread.join()関数のSwiftアナログを取得したいと思います。Java Thread.join()のSwiftアナログ

var ret: JSON = JSON("{\"code\":\"-3\"}") 
     var cont: Bool = true 

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), { 

     let req = Alamofire.request(.POST, "https://pornhub.com", parameters: parameters).validate().responseJSON { response in 
      switch response.result { 
      case .Success(let data): 
       let json = JSON(data) 
       print("TEST: " + ret.string!) 
       ret = json 
      case .Failure(let error): 
       print("TEST: " + ret.string!) 
       ret = (JSON("{\"code\":\"-2\"}")) 
      } 
     } 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 

      cont = false 

     }) 

    }) 

    while(cont) { 
     sleep(1) 
    } 

    return ret 

答えて

0

この場合であってもasyncを使用なぜあなたはとにかく、メインスレッドをブロックしているので?

メインスレッド(通常はUIスレッド、通常は非常に悪いアイデア)をブロックしない場合は、コードで指定したメソッドを呼び出して「完了」ブロックを渡す必要があります。その完了ブロックはretの値になり、プロセスを続行できます。その説明を見るには少し難しいかもしれので、私は擬似コードでそれを説明しようとするでしょう。ただ、メインスレッドをブロックし、あなたの長いタスクをないように

function mainThread() 
{ 
    var somethingINeed = firstAttempt() 
    doSomethingWithReturn(somethingINeed); 
} 

function firstAttempt() 
{ 
    var ret = doSomethingLong() 
    return ret 
} 

。その代わりに、代わりにブロックを使用して非同期で、(再び、疑似コード)は、このような何かを試してみてください。ここで

function mainThread() 
{ 
    secondAttempt(method(var ret) 
    { 
     doSomethingWithReturn(ret); 
    }) 
} 

function secondAttempt(functionBlock) 
{ 
    async{ 
     var ret = doSomethingLong() 
     functionBlock(ret) 
    } 
} 
0

は、あなたがそれを行うべきかです:

func post(parameters: [String : AnyObject], handler: Result<JSON, NSError> -> Void) { 
    Alamofire.request(.POST, "https://hehe.com", parameters: parameters) 
     .validate().responseJSON { response in 
     switch response.result { 
     case .Success(let jsonObject): 
      let json = JSON(jsonObject) 
      handler(.Success(json)) 
     case .Failure(let error): 
      handler(.Failure(error)) 
     } 
    } 
} 

あなたは、このメソッドを呼び出すことができますこのように:

post(["some" : "parameters"]) { response in 
    // The following part is called asynchronously, therefore you need to wrap UI updates in a dispatch main block: 

    dispatch_async(dispatch_get_main_queue()) { 
     switch response { 
     case .Success(let json): 
      print(json) // Update your UI with the json here 
     case .Failure(let error): 
      print(error) // Update your UI with an error here 
     } 
    } 
} 
関連する問題