2016-05-15 19 views
0

私はアプリケーションを作成しています。ボタンをクリックすると、すべてのユーザーと推定されたETAでtableviewが作成されます。ユーザーをループしてその場所を取得しても、同じ順序で配列を作成するわけではありません。したがって、そのループスルーと時間がすべて混在するようになります。私はそれらを介してループのいくつかの異なる方法を試してみましたが、それは遅延され、異なる時に実行されますdirections.calculateETAセクションを取得するように思えます。誰も私がこれを効率的に実行できるようにループが順不同で実行されないようにすることはできますか?Apple Mapkit calculateETAWithCompletionHandler loop through array

for user in usersArray { 

    var userLocations:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: user["location"].latitude, longitude: user["location"].longitude) 

    ETARequest(userLocations) 

} 

func ETARequest(destination:CLLocationCoordinate2D) { 

    let request = MKDirectionsRequest() 

    if let currentLocation = self.manager.location?.coordinate { 

     request.source = MKMapItem(placemark: MKPlacemark(coordinate: currentLocation, addressDictionary: nil)) 

     request.destination = MKMapItem(placemark: MKPlacemark(coordinate: destination, addressDictionary: nil)) 

     request.transportType = .Automobile 

     let directions = MKDirections(request: request) 

     directions.calculateETAWithCompletionHandler({ (response, error) in 

      if error == nil { 

       if let interval = response?.expectedTravelTime { 

        print(self.formatTimeInterval(interval)) 

        self.durationArray.insert(self.formatTimeInterval(interval), atIndex: 0) 

        if self.durationArray.count == self.allUsers.count { 

         print(self.durationArray) 

         self.tableView.reloadData() 

        } 

       } 

      } else { 

       print("Error Occurred") 
      } 

     }) 

    } 
} 

答えて

0

ここでの問題は、calculateETAWithCompletionHandlerがネットワーク要求を行うことです。これは非同期関数なので、あなたが呼び出したすべての呼び出しが送信したのと同じ順序で返ってくると想定することはできません。ここでは、この問題に対する一つの解決策です:

オプションのdurationプロパティでuserオブジェクトを持っている場合は、入力として1を取るためにあなたのETARequestメソッドをリファクタリングすることができます

func ETARequest(destination:CLLocationCoordinate2D, user: UserType) { 
    //Do stuff... 
} 

次に、あなた完了ハンドラブロックにcalculateETAWithCompletionHandlerに、self.durationArray.insert(self.formatTimeInterval(interval), atIndex: 0)user.duration = self.formatTimeInterval(interval)に置き換えることができます。

このようにして、各ユーザーには期間が関連付けられ、必要な順番でユーザーを繰り返して表示することができます。

+0

意味があります。私はそれを試し、あなたに知らせるでしょう。ありがとう! –

+1

これはすごくうまくいった。私はカスタムクラスを作成しました。私のデータベースからダウンロードしたユーザーの配列。私のデータベースの各ユーザについて、自分のカスタムクラスに情報を追加しました。 user.name user。場所 user.toUserDistance 私はそれらをループして、User:UserType関数にユーザーを割り当てました。完璧に働いた! –