2015-10-28 17 views
8

whileループ内で非同期関数を使用したいが、関数が終了するのに十分な時間が得られず、whileループが再び開始して終了しない。 この問題をインクリメント変数で実装する必要がありますが、その解決策は何ですか?どうもありがとう。 "繰り返しの中へ" の間
出力ループ -Swift:whileループへの非同期メソッド

var condition = true 
var userId = Int.random(1...1000) 
repeat { 
    print("Into repeat") 
    checkId(userId, completionHandler: { (success:Bool) ->() in 
    if success { 
      condition = false 
    } else { 
      userId = Int.random(1...1000) 
     } 
}) } while condition 


func checkId(userId:Int,completionHandler: (success:Bool) ->()) ->() { 
     print("Into function") 
     let query = PFUser.query() 
     query!.whereKey("userId", equalTo: userId) 
     query!.findObjectsInBackgroundWithBlock({ (object:[PFObject]?, error:NSError?) -> Void in 
      if object!.isEmpty { 
       completionHandler(success:false) 
      } else { 
       completionHandler(success:true) 
      } 
     }) 
    } 

答えて

15

であなたは再帰関数でこれを行うことができます参照してください使用する必要があります。私はこのコードをテストしていませんが、私はそれは少しこの

func asyncRepeater(userId:Int, foundIdCompletion: (userId:Int)->()){ 
    checkId(userId, completionHandler: { (success:Bool) ->() in 
     if success { 
      foundIdCompletion(userId:userId) 
     } else { 
      asyncRepeater(userId:Int.random(1...1000), completionHandler: completionHandler) 
     } 
    }) 
} 
+0

ループよりもはるかにクリーンです。私はあなたがasyncRepeaterで2番目のパラメータを必要とするとは思わない。 – spirographer

+0

はいfoundidcompletionの必要はありません、それは非常にうまく動作します! – PoolHallJunkie

+0

グローバル値を変更するのではなく、完了したときに値を返す方が良いと思うので、これを追加しました。 – Moriya

5

"関数には、" あなたはdispatch_group

repeat { 
    // define a dispatch_group 
    let dispatchGroup = dispatch_group_create() 
    dispatch_group_enter(dispatchGroup) // enter group 
    print("Into repeat") 
    checkId(userId, completionHandler: { (success:Bool) ->() in 
     if success { 
      condition = false 
     } else { 
      userId = Int.random(1...1000) 
     } 
    // leave group 
    dispatch_group_leave(dispatchGroup) 
    }) 
    // this line block while loop until the async task above completed 
    dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER) 
} while condition 

がよりApple document

+0

私が必要なものと思われるが、それはまだ仕事をするように見えることができると思います。これは一度だけループしますが、funcはクエリを終了できません... – PoolHallJunkie

関連する問題