通过 RPC 监听 Firestore 文档更改 API
Listening to Firestore Document Changes Through RPC API
我目前正在尝试使用显示如何实现和使用双向流的RPC API provided by Google Firestore through an Unity Application via the following Code Snippet. The snippet is based on the Protobuffer Definitions and the official gRPC Tutorial:
public async void ListenTest()
{
// create cancellation token:
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken cancellationToken = source.Token;
using (AsyncDuplexStreamingCall<ListenRequest, ListenResponse> call = client.Listen())
{
// create listenRequest with corresponding properties:
var listenRequest = new ListenRequest();
listenRequest.Database = database;
listenRequest.AddTarget = new Target();
listenRequest.AddTarget.Documents = new Target.Types.DocumentsTarget
{
Documents = { database + "/documents/MyCollection/MyDocument" }
};
// task to handle response stream messages
var responseReaderTask = Task.Run(async () =>
{
while (await call.ResponseStream.MoveNext(cancellationToken))
{
ListenResponse loc = call.ResponseStream.Current;
Debug.Log("Received " + loc);
}
});
Debug.Log("Listening for " + database + "/documents/MyCollection/MyDocument");
// 1. asynchronously send listenRequest
await call.RequestStream.WriteAsync(listenRequest);
// 2. wait until listenRequest is sent
await call.RequestStream.CompleteAsync();
// 3. handle responses...
await responseReaderTask;
}
}
执行此操作会立即终止 responseReaderTask
,Firestore 中所做的更改不会到达应用程序。
这段代码有问题吗?我读了一个尚未回答的 similar question,它解释了 Go 语言的相同问题。可能是同一个问题。
通过 client.GetDocument(getDocumentRequest)
检索单个文档有效。
好的,我发现了我犯的错误,也许这对后代有帮助,我只是删除了以下行以使其正常工作:
// 2. wait until listenRequest is sent
await call.RequestStream.CompleteAsync();
似乎在 AsyncDuplexStreamingCall
中流不是相互独立的(不像 the example I used as a basis 中的两个双向流)。 RequestStream
完成后,ResponseStream
也终止了,所以我无法观察到任何变化。 AsyncDuplexStreamingCall
中的 Duplex 暗示了这种行为。
我目前正在尝试使用显示如何实现和使用双向流的RPC API provided by Google Firestore through an Unity Application via the following Code Snippet. The snippet is based on the Protobuffer Definitions and the official gRPC Tutorial:
public async void ListenTest()
{
// create cancellation token:
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken cancellationToken = source.Token;
using (AsyncDuplexStreamingCall<ListenRequest, ListenResponse> call = client.Listen())
{
// create listenRequest with corresponding properties:
var listenRequest = new ListenRequest();
listenRequest.Database = database;
listenRequest.AddTarget = new Target();
listenRequest.AddTarget.Documents = new Target.Types.DocumentsTarget
{
Documents = { database + "/documents/MyCollection/MyDocument" }
};
// task to handle response stream messages
var responseReaderTask = Task.Run(async () =>
{
while (await call.ResponseStream.MoveNext(cancellationToken))
{
ListenResponse loc = call.ResponseStream.Current;
Debug.Log("Received " + loc);
}
});
Debug.Log("Listening for " + database + "/documents/MyCollection/MyDocument");
// 1. asynchronously send listenRequest
await call.RequestStream.WriteAsync(listenRequest);
// 2. wait until listenRequest is sent
await call.RequestStream.CompleteAsync();
// 3. handle responses...
await responseReaderTask;
}
}
执行此操作会立即终止 responseReaderTask
,Firestore 中所做的更改不会到达应用程序。
这段代码有问题吗?我读了一个尚未回答的 similar question,它解释了 Go 语言的相同问题。可能是同一个问题。
通过 client.GetDocument(getDocumentRequest)
检索单个文档有效。
好的,我发现了我犯的错误,也许这对后代有帮助,我只是删除了以下行以使其正常工作:
// 2. wait until listenRequest is sent
await call.RequestStream.CompleteAsync();
似乎在 AsyncDuplexStreamingCall
中流不是相互独立的(不像 the example I used as a basis 中的两个双向流)。 RequestStream
完成后,ResponseStream
也终止了,所以我无法观察到任何变化。 AsyncDuplexStreamingCall
中的 Duplex 暗示了这种行为。