2017-10-12 39 views
0

APIコールから情報を取得し、結果のJSONを解析し、各結果アイテムをループしてこの情報を表示する関数をコーディングしています次のView Controllerです。このループの中で、Firestoreデータベースから各項目の情報を取得する必要があります。Cloud Firestore - ループされたgetDocumentリクエスト(500以上のドキュメント)で遅いパフォーマンス(Swift)

私は& Firestore 0.8.0

次のコードは、私はAで、アイテムは私達のデータベースに存在しない可能性がある場合を考慮に入れており、これまで使ってきたものですスウィフト4を使用しています( - >Crashes with Firestore、文書はあなたのコレクションに存在しない場合はそれによって現在Firestoreが最初の値nilを返しませんコードは、この質問を使用して書かれていた)

for item in results { 
    dispatch.enter() 
    //Main loop code for processing the API Call & pulling the document ID for this item 

    let docRef = db.collection("collection").document(documentID) 
    docRef.getDocument { (document, error) in 
     if (document?.exists ?? false), error == nil { 
      if let document = document { 
       let data = document.data() 
       print("EXISTS") 
       //do things 
       dispatch.leave() 
      } else { 
       print("Document does not exist") 
       dispatch.leave() 
      } 
     } else { 
      print("DOES NOT EXIST") 
      //do other things 
      dispatch.leave() 
     } 
    } 
} 
dispatch.notify(queue: .main) { 
    //perform a segue to the data display VC 
} 

を:すべてのFirestore要求が完了したときにのみ発生セグエ

問題は、この機能が完了するまでに数分かかるということです。このループされたドキュメント要求をより速く実行する方法はありますか?これは単なるベータ版ですか?

当社Firestoreコレクションは、最終的には1,000,000以上のドキュメントを持つことになり、次のように各文書から引き出されるフィールドは、ネストされた起源である:

collection { 
    document { 
     object { 
      item1: data to pull 
      item2: data to pull 
      ...etc 
     } 
    } 
} 

任意の助けをいただければ幸いです!私はこれとは逆のアプローチを取っていたよう

UPDATE &結論

はですね!データベースの性質上、APIデータのすべてのドキュメントを保存するという意味でFirestoreデータベースに対して単一のクエリを実行してデータを制限してから、最初のクエリで見つかったドキュメントのみに基づいて結果を返すようにします。これにより、APIコール結果ドキュメントがデータベースに存在するかどうかを確認する必要がなくなります。イージーピーシー!

+0

コレクション全体を読み込むことはできません一度に1つのドキュメントをループして読み込むのではなく、 –

+0

@MorganChen getDocumentsを参照している場合は、ユーザーのデバイス上でパフォーマンスが非常に重くなります。彼らは50kbサイズのドキュメントを1,000,000枚読み込んで、それぞれのドキュメントから約5kbのデータを約500〜1,000件のデータで表示することがあります。 – Hendies

+0

私は誤解を招くかもしれませんが、クエリを限定してロードすることはできませんすべて1000000を読み込むのではなく、500-1000結果? –

答えて

1

私は、データベースに500以上の独立したフェッチ要求を作成していると思います。それはおそらく何があっても遅くなるだろう。

このデータをコレクションに入れて、コレクションにクエリを実行して必要なドキュメントだけを取得する方法を探します。少なくとも1回の呼び出しでこのデータを得ることができます(または、一度に500件の文書をすべて必要としない場合はページ区切りのデータを取得することをお勧めします)

+0

私はこれらの文書をデータベースに保存しているので、私は同意します。私たちのデータベースに存在します。私は逆のアプローチをとっているようだが、実際にはこれらの文書がデータベースに存在するかどうかを確認する必要はありません。シンプルなデータのフラット化と単一のクエリのあとにAPI呼び出しが行われます – Hendies

関連する問題