2016-10-26 5 views
0

infinitループで機能するため、URLからデータを保存できません。どのようにそれを修正する? マイコード:非同期タスクは外部変数を変更しません。 Swift 3

func getRegion2(){ 
    let method = "region/" 

    var url = serviceUrl+method 
    var myArray: [String]() 
    while(url != nil){ 

     Alamofire.request(url).validate().responseJSON { response in 
      switch response.result { 
      case .success(let data): 

       let nextUrl = JSON(data)["next"].stringValue 
       url = nextUrl 
       myArray = myArray + myArray 
       print(nextUrl) 

      case .failure(let error): 
       print("Request failed with error: \(error)") 
      } 
     } 
    } 
    print(myArray) 
} 

「しばらく」なしで実行すると、すべてが正常に動作します。

+1

を?あなたの目的はなんですか ? – emresancaktar

+3

ブロックは非同期です。ですから、 'myArray = myArray + myArray'でこの行をチェックする必要があります。この行の後に印刷してください。 –

+0

@emresancaktar Alamofire.request(url)を実行する必要がある時間がどれくらいかわからないため、「while」を使用します。最初のステップ:デフォルトのURLからデータをダウンロードします。データから配列を保存し、nextUrlをチェックします。ステップ2:nextUrlがnilでなければ、nextUrlからデータをダウンロードし、配列などを追加してください。 –

答えて

0

一つの可能​​な解決策は、再帰関数とディスパッチグループ(テストされていない)を組み合わせることである。

func getRegion2(){ 
    let method = "region/" 

    var url = serviceUrl+method 
    var myArray: [String] = [] 

    let group = DispatchGroup() 

    func getRegion(with url: String) { 
     group.enter() 
     Alamofire.request(url).validate().responseJSON { response in 
      switch response.result { 
      case .success(let data): 

       let nextUrl = JSON(data)["next"].stringValue 
       myArray = myArray + someArrayFromRespnse 
       print(nextUrl) 

       if nextUrl != nil { 
        getRegion(with: nextUrl) 
       } 

       group.leave() 
      case .failure(let error): 
       print("Request failed with error: \(error)") 
      } 
     } 
    } 

    getRegion(with: url) 

    group.notify(queue: DispatchQueue.main) { 
     print(myArray) 
    } 
} 

私はcompletionBlock使用する:あなたはしばらく使わなぜ

func getRegion2(completion:() -> [String]?) { 
    let method = "region/" 
    var url = serviceUrl+method 
    var myArray: [String] = [] 

    func getRegion(with url: String) { 
     Alamofire.request(url).validate().responseJSON { response in 
      switch response.result { 
      case .success(let data): 

       let nextUrl = JSON(data)["next"].stringValue 
       myArray = myArray + someArrayFromRespnse 
       print(nextUrl) 

       if nextUrl != nil { 
        getRegion(with: nextUrl) 
       } else { 
        completion(myArray) 
       } 

      case .failure(let error): 
       completion(nil) 
      } 
     } 
    } 

    getRegion(with: url) 
} 
+0

それは動作します。どうもありがとうございます!!! –

+0

お手伝いをいたします。 – shallowThought

関連する問題