2017-02-25 1 views
1

私は、複数のクエリを設定した関数を持っています。この機能は長くて、多くの作業が必要ですが、問題は1つではありませんが、完全に機能します。以前のクエリでいくつかの情報に依存するクエリがあり、前のクエリが完全に完了せず、2番目のクエリがnil値をアンラップさせたときにアプリケーションをクラッシュさせることがあります。ここでは一般的なセットアップは次のとおりです。同じ関数内で別のクエリが実行される前にクエリを確実に行う方法はありますか?

func QueryandAppend(completion: (() -> Void)?){ 
    let userLinkQuery = PFUser.query()//query1 
    userLinkQuery?.findObjectsInBackground(block: { (objects, error) in 
     if let users = objects{ 
      for object in users{ 
       if let user = object as? PFUser{ 
        userLinkArray[user.objectId!] = user.username 
       } 
      } 
     } 
     }) 

     let appendingQuery = PFQuery(classname: "Stuff")//query2 
      appendingQuery.findObjectsInBackground { (objects, error) in 
      for object in objects{ 
       creatorArray.append(userLinkArray[object["User"] as! String]!) 
      } 
      ... 
      completion!() 

    } 

完了ハンドラは、必ず全体の機能を作るために使用されている(とクエリのすべてが)viewDidLoad()で何かを実行する前に完了しています。しかし、の中での中にquery2が実行される前に関数query1が確実に行われるようにするにはどうすればよいですか?

+0

として、良い約束のフレームワークを見てみましょう可能性がどのように正確にクエリが実行され、そしてどのデータベースあなたがターゲットとしていますか?並行して実行されるクエリがデータベースの機能であるか、GCDを使用していますか? – kennytm

+0

@kennytm私はDBとしてherokuによってホストされている解析サーバを使用しています。並行して動作するものは特別な機能ではありません。私が持っていたのは単なる一般的な設定でした。私は、query1がquery2の前に書かれていたので、常に最初に実行されると考えました。 –

+0

[Parse SDK](https://parseplatform.github.io/docs/ios/guide/)を使用していると仮定します。 )? – kennytm

答えて

2

ネットワークやその他の非同期操作でこれを行うプロトタイプの方法は、操作を連鎖させ、個々のネットワーク操作をそれぞれ特定のルーチンに分割することさえできます。個々の操作には完了コールバックがあるので、最初の呼び出しの完了から2番目のルーチンを呼び出すだけです。

func QueryandAppend(completion: ((Bool) -> Void)?) { 
    PFUser.query().findObjectsInBackground { (objects, error) in 
     guard error == nil, let users = objects else { 
      completion?(false) 
      return 
     } 

     for object in users { 
      if let user = object as? PFUser, 
       let objectId = user.objectId { 
       userLinkArray[objectId] = user.username 
      } 
     } 

     PFQuery(classname: "Stuff").findObjectsInBackground { (objects, error) in 
      if error != nil { 
       // Handle error case 
       completion?(false) 
       return 
      } 

      for object in objects { 
       creatorArray.append(userLinkArray[object["User"] as! String]!) 
      } 

      completion?(true) 
     } 
    } 
} 

また、より現代的な文体的なアプローチのために、あなたは、このようなPromiseKit

+0

もしあなたが '成功すれば'の意味を説明できますか?実際のクエリ1はオブジェクトをプルし、このオブジェクトのパラメータを使用して配列を追加します。私のコードにもっと具体的な答えを説明できますか?私は実際にコールバックを一般的な意味で理解していません(それらを見ても)最初のクエリの特定のコードで質問を編集しました。両方のクエリで –

+0

** –

関連する問題