onSnapshot()
メソッドを使用すると、ドキュメントをリッスンできます。コールバックを使用した最初の呼び出しでは、単一のドキュメントの現在のコンテンツですぐにドキュメント スナップショットが作成されます。次に、コンテンツが変更されるたびに、別の呼び出しによってドキュメント スナップショットが更新されます。
ウェブ
db.collection("cities").doc("SF") .onSnapshot(function(doc) { console.log("Current data: ", doc.data()); });
Swift
db.collection("cities").document("SF") .addSnapshotListener { documentSnapshot, error in guard let document = documentSnapshot else { print("Error fetching document: \(error!)") return } guard let data = document.data() else { print("Document data was empty.") return } print("Current data: \(data)") }
Objective-C
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListener:^(FIRDocumentSnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching document: %@", error); return; } NSLog(@"Current data: %@", snapshot.data); }];
Java
final DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "Current data: " + snapshot.getData()); } else { Log.d(TAG, "Current data: null"); } } });
Kotlin+KTX
val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener { snapshot, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "Current data: ${snapshot.data}") } else { Log.d(TAG, "Current data: null") } }
Java
DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirestoreException e) { if (e != null) { System.err.println("Listen failed: " + e); return; } if (snapshot != null && snapshot.exists()) { System.out.println("Current data: " + snapshot.getData()); } else { System.out.print("Current data: null"); } } });
Python
# Create an Event for notifying main thread. callback_done = threading.Event() # Create a callback on_snapshot function to capture changes def on_snapshot(doc_snapshot, changes, read_time): for doc in doc_snapshot: print(u'Received document snapshot: {}'.format(doc.id)) callback_done.set() doc_ref = db.collection(u'cities').document(u'SF') # Watch the document doc_watch = doc_ref.on_snapshot(on_snapshot)
C++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener( [](const DocumentSnapshot& snapshot, Error error) { if (error == Error::Ok) { if (snapshot.exists()) { std::cout << "Current data: " << snapshot << '\n'; } else { std::cout << "Current data: null\n"; } } else { std::cout << "Listen failed: " << error << '\n'; } });
Node.js
let doc = db.collection('cities').doc('SF'); let observer = doc.onSnapshot(docSnapshot => { console.log(`Received doc snapshot: ${docSnapshot}`); // ... }, err => { console.log(`Encountered error: ${err}`); });
Go
// Snippet coming soon
PHP
// Not supported in the PHP client library
Unity
DocumentReference docRef = db.Collection("cities").Document("SF"); docRef.Listen(snapshot => { Debug.Log("Callback received document snapshot."); Debug.Log(String.Format("Document data for {0} document:", snapshot.Id)); Dictionary<string, object> city = snapshot.ToDictionary(); foreach (KeyValuePair<string, object> pair in city) { Debug.Log(String.Format("{0}: {1}", pair.Key, pair.Value)); } });
C#
DocumentReference docRef = db.Collection("cities").Document("SF"); FirestoreChangeListener listener = docRef.Listen(snapshot => { Console.WriteLine("Callback received document snapshot."); Console.WriteLine("Document exists? {0}", snapshot.Exists); if (snapshot.Exists) { Console.WriteLine("Document data for {0} document:", snapshot.Id); Dictionary<string, object> city = snapshot.ToDictionary(); foreach (KeyValuePair<string, object> pair in city) { Console.WriteLine("{0}: {1}", pair.Key, pair.Value); } } });
Ruby
// Snippet coming soon
ローカル変更のイベント
アプリでローカル書き込みが行われると、すぐにスナップショット リスナーが起動します。これは「レイテンシ補正」という重要な機能によるものです。書き込みを実行すると、データがバックエンドに送信される前に、新しいデータがリスナーに通知されます。
取得されたドキュメントは、バックエンドにまだ書き込まれていないローカル変更がドキュメントにあるかどうかを示す metadata.hasPendingWrites
プロパティを持ちます。このプロパティを使用すると、スナップショット リスナーで受け取るイベントのソースを特定できます。
ウェブ
db.collection("cities").doc("SF") .onSnapshot(function(doc) { var source = doc.metadata.hasPendingWrites ? "Local" : "Server"; console.log(source, " data: ", doc.data()); });
Swift
db.collection("cities").document("SF") .addSnapshotListener { documentSnapshot, error in guard let document = documentSnapshot else { print("Error fetching document: \(error!)") return } let source = document.metadata.hasPendingWrites ? "Local" : "Server" print("\(source) data: \(document.data() ?? [:])") }
Objective-C
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListener:^(FIRDocumentSnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching document: %@", error); return; } NSString *source = snapshot.metadata.hasPendingWrites ? @"Local" : @"Server"; NSLog(@"%@ data: %@", source, snapshot.data); }];
Java
final DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } String source = snapshot != null && snapshot.getMetadata().hasPendingWrites() ? "Local" : "Server"; if (snapshot != null && snapshot.exists()) { Log.d(TAG, source + " data: " + snapshot.getData()); } else { Log.d(TAG, source + " data: null"); } } });
Kotlin+KTX
val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener { snapshot, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } val source = if (snapshot != null && snapshot.metadata.hasPendingWrites()) "Local" else "Server" if (snapshot != null && snapshot.exists()) { Log.d(TAG, "$source data: ${snapshot.data}") } else { Log.d(TAG, "$source data: null") } }
Java
# Not yet supported in the Java client library
Python
// Not yet supported in Python client library
C++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener([](const DocumentSnapshot& snapshot, Error error) { if (error == Error::Ok) { const char* source = snapshot.metadata().has_pending_writes() ? "Local" : "Server"; if (snapshot.exists()) { std::cout << source << " data: " << snapshot.Get("name").string_value() << '\n'; } else { std::cout << source << " data: null\n"; } } else { std::cout << "Listen failed: " << error << '\n'; } });
Node.js
// Not yet supported in the Node.js client library
Go
// Not yet supported in the Go client library
PHP
// Not supported in the PHP client library
Unity
// Not yet supported in the Unity SDK
C#
// Not yet supported in the C# client library
Ruby
// Not yet supported in the Ruby client library
メタデータ変更のイベント
ドキュメント、コレクション、またはクエリへの変更をリッスンする場合、リスナーで受け取るイベントの詳細レベルを制御するオプションを渡すことができます。
デフォルトでは、メタデータにのみ影響する変更は、リスナーに通知されません。アプリで新規ドキュメントを書き込むと、以下のような処理が発生します。
- 新しいデータにより、直ちに変更イベントが発生します。ドキュメントがまだバックエンドに書き込まれていないため、「保留中の書き込み」フラグは
true
です。 - ドキュメントがバックエンドに書き込まれます。
- バックエンドから、書き込みの成功がクライアントに通知されます。ドキュメント データは変更されていませんが、「保留中の書き込み」フラグが
false
に変化したため、メタデータには変更が発生しています。
ドキュメントまたはクエリのメタデータが変更されたときにスナップショット イベントを受け取る必要がある場合は、リスナーをアタッチするときに ListenOptions オブジェクトを渡します。
ウェブ
db.collection("cities").doc("SF") .onSnapshot({ // Listen for document metadata changes includeMetadataChanges: true }, function(doc) { // ... });
Swift
// Listen to document metadata. db.collection("cities").document("SF") .addSnapshotListener(includeMetadataChanges: true) { documentSnapshot, error in // ... }
Objective-C
// Listen for metadata changes. [[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListenerWithIncludeMetadataChanges:YES listener:^(FIRDocumentSnapshot *snapshot, NSError *error) { // ... }];
Java
// Listen for metadata changes to the document. DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(MetadataChanges.INCLUDE, new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { // ... } });
Kotlin+KTX
// Listen for metadata changes to the document. val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener(MetadataChanges.INCLUDE) { snapshot, e -> // ... }
Java
// Not yet supported in the Java client library
Python
// Not yet supported in Python client library
C++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener( MetadataChanges::kInclude, [](const DocumentSnapshot& snapshot, Error error) { /* ... */ });
Node.js
// Not yet supported the Node.js client library
Go
// Not yet supported in the Go client library
PHP
// Not supported in the PHP client library
Unity
// Not yet supported in the Unity SDK
C#
// Not yet supported in the C# client library
Ruby
// Not yet supported in the Ruby client library
コレクション内の複数のドキュメントのリッスン
ドキュメントの場合と同様に、get()
ではなく onSnapshot()
を使用してクエリの結果をリッスンできます。これにより、クエリ スナップショットが作成されます。たとえば、状態が CA
のドキュメントをリッスンするには、次のようにします。
ウェブ
db.collection("cities").where("state", "==", "CA") .onSnapshot(function(querySnapshot) { var cities = []; querySnapshot.forEach(function(doc) { cities.push(doc.data().name); }); console.log("Current cities in CA: ", cities.join(", ")); });
Swift
db.collection("cities").whereField("state", isEqualTo: "CA") .addSnapshotListener { querySnapshot, error in guard let documents = querySnapshot?.documents else { print("Error fetching documents: \(error!)") return } let cities = documents.map { $0["name"]! } print("Current cities in CA: \(cities)") }
Objective-C
[[[self.db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching documents: %@", error); return; } NSMutableArray *cities = [NSMutableArray array]; for (FIRDocumentSnapshot *document in snapshot.documents) { [cities addObject:document.data[@"name"]]; } NSLog(@"Current cities in CA: %@", cities); }];
Java
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } List<String> cities = new ArrayList<>(); for (QueryDocumentSnapshot doc : value) { if (doc.get("name") != null) { cities.add(doc.getString("name")); } } Log.d(TAG, "Current cites in CA: " + cities); } });
Kotlin+KTX
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener { value, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } val cities = ArrayList<String>() for (doc in value!!) { doc.getString("name")?.let { cities.add(it) } } Log.d(TAG, "Current cites in CA: $cities") }
Java
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirestoreException e) { if (e != null) { System.err.println("Listen failed:" + e); return; } List<String> cities = new ArrayList<>(); for (DocumentSnapshot doc : snapshots) { if (doc.get("name") != null) { cities.add(doc.getString("name")); } } System.out.println("Current cites in CA: " + cities); } });
Python
# Create an Event for notifying main thread. callback_done = threading.Event() # Create a callback on_snapshot function to capture changes def on_snapshot(col_snapshot, changes, read_time): print(u'Callback received query snapshot.') print(u'Current cities in California:') for doc in col_snapshot: print(u'{}'.format(doc.id)) callback_done.set() col_query = db.collection(u'cities').where(u'state', u'==', u'CA') # Watch the collection query query_watch = col_query.on_snapshot(on_snapshot)
C++
db->Collection("cities") .WhereEqualTo("state", FieldValue::FromString("CA")) .AddSnapshotListener([](const QuerySnapshot& snapshot, Error error) { if (error == Error::Ok) { std::vector<std::string> cities; std::cout << "Current cities in CA: " << error << '\n'; for (const DocumentSnapshot& doc : snapshot.documents()) { cities.push_back(doc.Get("name").string_value()); std::cout << "" << cities.back() << '\n'; } } else { std::cout << "Listen failed: " << error << '\n'; } });
Node.js
let query = db.collection('cities').where('state', '==', 'CA'); let observer = query.onSnapshot(querySnapshot => { console.log(`Received query snapshot of size ${querySnapshot.size}`); // ... }, err => { console.log(`Encountered error: ${err}`); });
Go
// Snippet coming soon
PHP
// Not supported in the PHP client library
Unity
Query query = db.Collection("cities").WhereEqualTo("State", "CA"); ListenerRegistration listener = query.Listen(snapshot => { Debug.Log("Callback received query snapshot."); Debug.Log("Current cities in California:"); foreach (DocumentSnapshot documentSnapshot in snapshot.Documents) { Debug.Log(documentSnapshot.Id); } });
C#
CollectionReference citiesRef = db.Collection("cities"); Query query = db.Collection("cities").WhereEqualTo("State", "CA"); FirestoreChangeListener listener = query.Listen(snapshot => { Console.WriteLine("Callback received query snapshot."); Console.WriteLine("Current cities in California:"); foreach (DocumentSnapshot documentSnapshot in snapshot.Documents) { Console.WriteLine(documentSnapshot.Id); } });
Ruby
// Snippet coming soon
スナップショット ハンドラは、クエリ結果が変更されるたびに(つまり、ドキュメントが追加、削除、変更されたときに)、新しいクエリ スナップショットを受け取ります。
スナップショット間の変更の表示
単純にクエリ スナップショット全体を使用するのではなく、クエリ スナップショット間でクエリ結果の実際の変更を確認すると便利な場合があります。たとえば、個々のドキュメントが追加、削除、変更されたときに、キャッシュを維持することができます。
ウェブ
db.collection("cities").where("state", "==", "CA") .onSnapshot(function(snapshot) { snapshot.docChanges().forEach(function(change) { if (change.type === "added") { console.log("New city: ", change.doc.data()); } if (change.type === "modified") { console.log("Modified city: ", change.doc.data()); } if (change.type === "removed") { console.log("Removed city: ", change.doc.data()); } }); });
Swift
db.collection("cities").whereField("state", isEqualTo: "CA") .addSnapshotListener { querySnapshot, error in guard let snapshot = querySnapshot else { print("Error fetching snapshots: \(error!)") return } snapshot.documentChanges.forEach { diff in if (diff.type == .added) { print("New city: \(diff.document.data())") } if (diff.type == .modified) { print("Modified city: \(diff.document.data())") } if (diff.type == .removed) { print("Removed city: \(diff.document.data())") } } }
Objective-C
[[[self.db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching documents: %@", error); return; } for (FIRDocumentChange *diff in snapshot.documentChanges) { if (diff.type == FIRDocumentChangeTypeAdded) { NSLog(@"New city: %@", diff.document.data); } if (diff.type == FIRDocumentChangeTypeModified) { NSLog(@"Modified city: %@", diff.document.data); } if (diff.type == FIRDocumentChangeTypeRemoved) { NSLog(@"Removed city: %@", diff.document.data); } } }];
Java
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "listen:error", e); return; } for (DocumentChange dc : snapshots.getDocumentChanges()) { switch (dc.getType()) { case ADDED: Log.d(TAG, "New city: " + dc.getDocument().getData()); break; case MODIFIED: Log.d(TAG, "Modified city: " + dc.getDocument().getData()); break; case REMOVED: Log.d(TAG, "Removed city: " + dc.getDocument().getData()); break; } } } });
Kotlin+KTX
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener { snapshots, e -> if (e != null) { Log.w(TAG, "listen:error", e) return@addSnapshotListener } for (dc in snapshots!!.documentChanges) { when (dc.type) { DocumentChange.Type.ADDED -> Log.d(TAG, "New city: ${dc.document.data}") DocumentChange.Type.MODIFIED -> Log.d(TAG, "Modified city: ${dc.document.data}") DocumentChange.Type.REMOVED -> Log.d(TAG, "Removed city: ${dc.document.data}") } } }
Java
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirestoreException e) { if (e != null) { System.err.println("Listen failed: " + e); return; } for (DocumentChange dc : snapshots.getDocumentChanges()) { switch (dc.getType()) { case ADDED: System.out.println("New city: " + dc.getDocument().getData()); break; case MODIFIED: System.out.println("Modified city: " + dc.getDocument().getData()); break; case REMOVED: System.out.println("Removed city: " + dc.getDocument().getData()); break; default: break; } } } });
C++
db->Collection("cities") .WhereEqualTo("state", FieldValue::FromString("CA")) .AddSnapshotListener([](const QuerySnapshot& snapshot, Error error) { if (error == Error::Ok) { for (const DocumentChange& dc : snapshot.DocumentChanges()) { switch (dc.type()) { case DocumentChange::Type::kAdded: std::cout << "New city: " << dc.document().Get("name").string_value() << '\n'; break; case DocumentChange::Type::kModified: std::cout << "Modified city: " << dc.document().Get("name").string_value() << '\n'; break; case DocumentChange::Type::kRemoved: std::cout << "Removed city: " << dc.document().Get("name").string_value() << '\n'; break; } } } else { std::cout << "Listen failed: " << error << '\n'; } });
Python
# Create an Event for notifying main thread. delete_done = threading.Event() # Create a callback on_snapshot function to capture changes def on_snapshot(col_snapshot, changes, read_time): print(u'Callback received query snapshot.') print(u'Current cities in California: ') for change in changes: if change.type.name == 'ADDED': print(u'New city: {}'.format(change.document.id)) elif change.type.name == 'MODIFIED': print(u'Modified city: {}'.format(change.document.id)) elif change.type.name == 'REMOVED': print(u'Removed city: {}'.format(change.document.id)) delete_done.set() col_query = db.collection(u'cities').where(u'state', u'==', u'CA') # Watch the collection query query_watch = col_query.on_snapshot(on_snapshot)
Node.js
let observer = db.collection('cities').where('state', '==', 'CA') .onSnapshot(querySnapshot => { querySnapshot.docChanges().forEach(change => { if (change.type === 'added') { console.log('New city: ', change.doc.data()); } if (change.type === 'modified') { console.log('Modified city: ', change.doc.data()); } if (change.type === 'removed') { console.log('Removed city: ', change.doc.data()); } }); });
Go
// Snippet coming soon
PHP
// Not supported in the PHP client library
Unity
Query query = db.Collection("cities").WhereEqualTo("State", "CA"); ListenerRegistration listener = query.Listen(snapshot => { foreach (DocumentChange change in snapshot.GetChanges()) { if (change.ChangeType == DocumentChange.Type.Added) { Debug.Log(String.Format("New city: {0}", change.Document.Id)); } else if (change.ChangeType == DocumentChange.Type.Modified) { Debug.Log(String.Format("Modified city: {0}", change.Document.Id)); } else if (change.ChangeType == DocumentChange.Type.Removed) { Debug.Log(String.Format("Removed city: {0}", change.Document.Id)); } } }); } }
C#
CollectionReference citiesRef = db.Collection("cities"); Query query = db.Collection("cities").WhereEqualTo("State", "CA"); FirestoreChangeListener listener = query.Listen(snapshot => { foreach (DocumentChange change in snapshot.Changes) { if (change.ChangeType.ToString() == "Added") { Console.WriteLine("New city: {0}", change.Document.Id); } else if (change.ChangeType.ToString() == "Modified") { Console.WriteLine("Modified city: {0}", change.Document.Id); } else if (change.ChangeType.ToString() == "Removed") { Console.WriteLine("Removed city: {0}", change.Document.Id); } } });
Ruby
// Snippet coming soon
初期状態は、サーバーから直接取得することも、ローカル キャッシュから取得することもできます。ローカル キャッシュに使用可能な状態がある場合、クエリ スナップショットにはキャッシュされたデータが最初に入力され、その後、クライアントがサーバーの状態に追いついたときにサーバーのデータで更新されます。
リスナーのデタッチ
データをリッスンする必要がなくなったら、イベント コールバックが呼び出されないようにリスナーをデタッチしなければなりません。これにより、クライアントは更新を受信するための帯域幅の使用を停止できます。例:
ウェブ
var unsubscribe = db.collection("cities") .onSnapshot(function (){ // Respond to data // ... }); // Later ... // Stop listening to changes unsubscribe();
Swift
let listener = db.collection("cities").addSnapshotListener { querySnapshot, error in // ... } // ... // Stop listening to changes listener.remove()
Objective-C
id<FIRListenerRegistration> listener = [[self.db collectionWithPath:@"cities"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { // ... }]; // ... // Stop listening to changes [listener remove];
Java
Query query = db.collection("cities"); ListenerRegistration registration = query.addSnapshotListener( new EventListener<QuerySnapshot>() { // ... }); // ... // Stop listening to changes registration.remove();
Kotlin+KTX
val query = db.collection("cities") val registration = query.addSnapshotListener { snapshots, e -> // ... } // ... // Stop listening to changes registration.remove()
Java
Query query = db.collection("cities"); ListenerRegistration registration = query.addSnapshotListener( new EventListener<QuerySnapshot>() { // ... }); // ... // Stop listening to changes registration.remove();
Python
# Terminate watch on a document doc_watch.unsubscribe()
C++
// Add a listener Query query = db->Collection("cities"); ListenerRegistration registration = query.AddSnapshotListener( [](const QuerySnapshot& snapshot, Error error) { /* ... */ }); // Stop listening to changes registration.Remove();
Node.js
let unsub = db.collection('cities').onSnapshot(() => { }); // ... // Stop listening for changes unsub();
Go
// Snippet coming soon
PHP
// Not supported in the PHP client library
Unity
listener.Stop();
C#
await listener.StopAsync();
Ruby
// Snippet coming soon
リッスンエラーの処理
たとえば、セキュリティ権限がないため、または無効なクエリでリッスンしようとしたため、リッスンが失敗することがあります(詳細については、有効なクエリと無効なクエリをご覧ください)。これらの障害を処理するには、スナップショット リスナーをアタッチするときにエラー コールバックを提供します。エラーが発生すると、リスナーはそれ以上イベントを受信しなくなるため、リスナーをデタッチする必要はありません。
ウェブ
db.collection("cities") .onSnapshot(function(snapshot) { //... }, function(error) { //... });
Swift
db.collection("cities") .addSnapshotListener { querySnapshot, error in if let error = error { print("Error retreiving collection: \(error)") } }
Objective-C
[[self.db collectionWithPath:@"cities"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (error != nil) { NSLog(@"Error retreving collection: %@", error); } }];
Java
db.collection("cities") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "listen:error", e); return; } for (DocumentChange dc : snapshots.getDocumentChanges()) { if (dc.getType() == Type.ADDED) { Log.d(TAG, "New city: " + dc.getDocument().getData()); } } } });
Kotlin+KTX
db.collection("cities") .addSnapshotListener { snapshots, e -> if (e != null) { Log.w(TAG, "listen:error", e) return@addSnapshotListener } for (dc in snapshots!!.documentChanges) { if (dc.type == DocumentChange.Type.ADDED) { Log.d(TAG, "New city: ${dc.document.data}") } } }
Java
db.collection("cities") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirestoreException e) { if (e != null) { System.err.println("Listen failed: " + e); return; } for (DocumentChange dc : snapshots.getDocumentChanges()) { if (dc.getType() == Type.ADDED) { System.out.println("New city: " + dc.getDocument().getData()); } } } });
Python
// Snippet coming soon
C++
// This is not yet supported.
Node.js
db.collection('cities') .onSnapshot((snapshot) => { //... }, (error) => { //... });
Go
// Snippet coming soon
PHP
// Not supported in the PHP client library
Unity
// Not supported in the Unity SDK.
C#
// Snippet coming soon
Ruby
// Snippet coming soon