aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Muxi Yan <mxyan@google.com>2018-10-23 10:22:18 -0700
committerGravatar Muxi Yan <mxyan@google.com>2018-10-23 10:22:18 -0700
commitf3e9224f0b34a6265830600c67293d96964a4c5c (patch)
tree0523ee249312046d7710cfe8bcb9a4af042940d1
parente39c146f0f7f1a56e0cd65ec5d707c8bb091366e (diff)
Remove retain of handler in callbacks and dispatch to dispatchQueue
-rw-r--r--src/objective-c/GRPCClient/GRPCCall.h11
-rw-r--r--src/objective-c/GRPCClient/GRPCCall.m21
-rw-r--r--src/objective-c/ProtoRPC/ProtoRPC.h8
-rw-r--r--src/objective-c/ProtoRPC/ProtoRPC.m63
-rw-r--r--src/objective-c/tests/GRPCClientTests.m24
-rw-r--r--src/objective-c/tests/InteropTests.m24
6 files changed, 77 insertions, 74 deletions
diff --git a/src/objective-c/GRPCClient/GRPCCall.h b/src/objective-c/GRPCClient/GRPCCall.h
index 2f23b879f1..85d0a302d1 100644
--- a/src/objective-c/GRPCClient/GRPCCall.h
+++ b/src/objective-c/GRPCClient/GRPCCall.h
@@ -155,12 +155,16 @@ extern NSString *const kGRPCTrailersKey;
@optional
-/** Issued when initial metadata is received from the server. */
+/**
+ * Issued when initial metadata is received from the server. The task must be scheduled onto the
+ * dispatch queue in property \a dispatchQueue.
+ */
- (void)receivedInitialMetadata:(NSDictionary *_Nullable)initialMetadata;
/**
* Issued when a message is received from the server. The message is the raw data received from the
- * server, with decompression and without proto deserialization.
+ * server, with decompression and without proto deserialization. The task must be scheduled onto the
+ * dispatch queue in property \a dispatchQueue.
*/
- (void)receivedRawMessage:(NSData *_Nullable)message;
@@ -168,7 +172,8 @@ extern NSString *const kGRPCTrailersKey;
* Issued when a call finished. If the call finished successfully, \a error is nil and \a
* trainingMetadata consists any trailing metadata received from the server. Otherwise, \a error
* is non-nil and contains the corresponding error information, including gRPC error codes and
- * error descriptions.
+ * error descriptions. The task must be scheduled onto the dispatch queue in property
+ * \a dispatchQueue.
*/
- (void)closedWithTrailingMetadata:(NSDictionary *_Nullable)trailingMetadata
error:(NSError *_Nullable)error;
diff --git a/src/objective-c/GRPCClient/GRPCCall.m b/src/objective-c/GRPCClient/GRPCCall.m
index 7e0640e8ae..29a0ed4e10 100644
--- a/src/objective-c/GRPCClient/GRPCCall.m
+++ b/src/objective-c/GRPCClient/GRPCCall.m
@@ -252,30 +252,21 @@ const char *kCFStreamVarName = "grpc_cfstream";
}
- (void)issueInitialMetadata:(NSDictionary *)initialMetadata {
- id<GRPCResponseHandler> handler = _handler;
- if ([handler respondsToSelector:@selector(receivedInitialMetadata:)]) {
- dispatch_async(handler.dispatchQueue, ^{
- [handler receivedInitialMetadata:initialMetadata];
- });
+ if (initialMetadata != nil && [_handler respondsToSelector:@selector(receivedInitialMetadata:)]) {
+ [_handler receivedInitialMetadata:initialMetadata];
}
}
- (void)issueMessage:(id)message {
- id<GRPCResponseHandler> handler = _handler;
- if ([handler respondsToSelector:@selector(receivedRawMessage:)]) {
- dispatch_async(handler.dispatchQueue, ^{
- [handler receivedRawMessage:message];
- });
+ if (message != nil && [_handler respondsToSelector:@selector(receivedRawMessage:)]) {
+ [_handler receivedRawMessage:message];
}
}
- (void)issueClosedWithTrailingMetadata:(NSDictionary *)trailingMetadata error:(NSError *)error {
- id<GRPCResponseHandler> handler = _handler;
NSDictionary *trailers = _call.responseTrailers;
- if ([handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
- dispatch_async(handler.dispatchQueue, ^{
- [handler closedWithTrailingMetadata:trailers error:error];
- });
+ if ([_handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
+ [_handler closedWithTrailingMetadata:trailers error:error];
}
}
diff --git a/src/objective-c/ProtoRPC/ProtoRPC.h b/src/objective-c/ProtoRPC/ProtoRPC.h
index 960a9a12bd..6f4b9eed75 100644
--- a/src/objective-c/ProtoRPC/ProtoRPC.h
+++ b/src/objective-c/ProtoRPC/ProtoRPC.h
@@ -30,11 +30,14 @@ NS_ASSUME_NONNULL_BEGIN
@optional
-/** Issued when initial metadata is received from the server. */
+/**
+ * Issued when initial metadata is received from the server. The task must be scheduled onto the
+ * dispatch queue in property \a dispatchQueue. */
- (void)receivedInitialMetadata:(NSDictionary *_Nullable)initialMetadata;
/**
* Issued when a message is received from the server. The message is the deserialized proto object.
+ * The task must be scheduled onto the dispatch queue in property \a dispatchQueue.
*/
- (void)receivedProtoMessage:(GPBMessage *_Nullable)message;
@@ -42,7 +45,8 @@ NS_ASSUME_NONNULL_BEGIN
* Issued when a call finished. If the call finished successfully, \a error is nil and \a
* trainingMetadata consists any trailing metadata received from the server. Otherwise, \a error
* is non-nil and contains the corresponding error information, including gRPC error codes and
- * error descriptions.
+ * error descriptions. The task must be scheduled onto the dispatch queue in property
+ * \a dispatchQueue.
*/
- (void)closedWithTrailingMetadata:(NSDictionary *_Nullable)trailingMetadata
error:(NSError *_Nullable)error;
diff --git a/src/objective-c/ProtoRPC/ProtoRPC.m b/src/objective-c/ProtoRPC/ProtoRPC.m
index 294f3a4cf5..27070a891d 100644
--- a/src/objective-c/ProtoRPC/ProtoRPC.m
+++ b/src/objective-c/ProtoRPC/ProtoRPC.m
@@ -172,53 +172,44 @@ static NSError *ErrorForBadProto(id proto, Class expectedClass, NSError *parsing
}
- (void)receivedInitialMetadata:(NSDictionary *_Nullable)initialMetadata {
- if (_handler && initialMetadata != nil) {
- id<GRPCProtoResponseHandler> handler = _handler;
- if ([handler respondsToSelector:@selector(initialMetadata:)]) {
- dispatch_async(handler.dispatchQueue, ^{
- [handler receivedInitialMetadata:initialMetadata];
- });
+ dispatch_async(_dispatchQueue, ^{
+ if (initialMetadata != nil && [self->_handler respondsToSelector:@selector(initialMetadata:)]) {
+ [self->_handler receivedInitialMetadata:initialMetadata];
}
- }
+ });
}
- (void)receivedRawMessage:(NSData *_Nullable)message {
- if (_handler && message != nil) {
- id<GRPCProtoResponseHandler> handler = _handler;
- NSError *error = nil;
- GPBMessage *parsed = [_responseClass parseFromData:message error:&error];
- if (parsed) {
- if ([handler respondsToSelector:@selector(receivedProtoMessage:)]) {
- dispatch_async(handler.dispatchQueue, ^{
- [handler receivedProtoMessage:parsed];
- });
- }
- } else {
- if ([handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
- dispatch_async(handler.dispatchQueue, ^{
- [handler closedWithTrailingMetadata:nil error:ErrorForBadProto(message, _responseClass, error)];
- });
+ dispatch_async(_dispatchQueue, ^{
+ if (self->_handler && message != nil) {
+ NSError *error = nil;
+ GPBMessage *parsed = [self->_responseClass parseFromData:message error:&error];
+ if (parsed) {
+ if ([self->_handler respondsToSelector:@selector(receivedProtoMessage:)]) {
+ [self->_handler receivedProtoMessage:parsed];
+ }
+ } else {
+ if ([self->_handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
+ [self->_handler closedWithTrailingMetadata:nil error:ErrorForBadProto(message, _responseClass, error)];
+ }
+ self->_handler = nil;
+ [self->_call cancel];
+ self->_call = nil;
}
- _handler = nil;
- [_call cancel];
- _call = nil;
}
- }
+ });
}
- (void)closedWithTrailingMetadata:(NSDictionary *_Nullable)trailingMetadata
error:(NSError *_Nullable)error {
- if (_handler) {
- id<GRPCProtoResponseHandler> handler = _handler;
- if ([handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
- dispatch_async(handler.dispatchQueue, ^{
- [handler closedWithTrailingMetadata:trailingMetadata error:error];
- });
+ dispatch_async(_dispatchQueue, ^{
+ if ([self->_handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
+ [self->_handler closedWithTrailingMetadata:trailingMetadata error:error];
}
- _handler = nil;
- }
- [_call cancel];
- _call = nil;
+ self->_handler = nil;
+ [self->_call cancel];
+ self->_call = nil;
+ });
}
- (dispatch_queue_t)dispatchQueue {
diff --git a/src/objective-c/tests/GRPCClientTests.m b/src/objective-c/tests/GRPCClientTests.m
index 2021540f28..bbe81502dc 100644
--- a/src/objective-c/tests/GRPCClientTests.m
+++ b/src/objective-c/tests/GRPCClientTests.m
@@ -115,22 +115,28 @@ static GRPCProtoMethod *kFullDuplexCallMethod;
}
- (void)receivedInitialMetadata:(NSDictionary *_Nullable)initialMetadata {
- if (_initialMetadataCallback) {
- _initialMetadataCallback(initialMetadata);
- }
+ dispatch_async(_dispatchQueue, ^{
+ if (_initialMetadataCallback) {
+ _initialMetadataCallback(initialMetadata);
+ }
+ });
}
- (void)receivedRawMessage:(GPBMessage *_Nullable)message {
- if (_messageCallback) {
- _messageCallback(message);
- }
+ dispatch_async(_dispatchQueue, ^{
+ if (_messageCallback) {
+ _messageCallback(message);
+ }
+ });
}
- (void)closedWithTrailingMetadata:(NSDictionary *_Nullable)trailingMetadata
error:(NSError *_Nullable)error {
- if (_closeCallback) {
- _closeCallback(trailingMetadata, error);
- }
+ dispatch_async(_dispatchQueue, ^{
+ if (_closeCallback) {
+ _closeCallback(trailingMetadata, error);
+ }
+ });
}
- (dispatch_queue_t)dispatchQueue {
diff --git a/src/objective-c/tests/InteropTests.m b/src/objective-c/tests/InteropTests.m
index d67dc0743e..c42718f15e 100644
--- a/src/objective-c/tests/InteropTests.m
+++ b/src/objective-c/tests/InteropTests.m
@@ -103,22 +103,28 @@ BOOL isRemoteInteropTest(NSString *host) {
}
- (void)receivedInitialMetadata:(NSDictionary *_Nullable)initialMetadata {
- if (_initialMetadataCallback) {
- _initialMetadataCallback(initialMetadata);
- }
+ dispatch_async(_dispatchQueue, ^{
+ if (_initialMetadataCallback) {
+ _initialMetadataCallback(initialMetadata);
+ }
+ });
}
- (void)receivedProtoMessage:(GPBMessage *_Nullable)message {
- if (_messageCallback) {
- _messageCallback(message);
- }
+ dispatch_async(_dispatchQueue, ^{
+ if (_messageCallback) {
+ _messageCallback(message);
+ }
+ });
}
- (void)closedWithTrailingMetadata:(NSDictionary *_Nullable)trailingMetadata
error:(NSError *_Nullable)error {
- if (_closeCallback) {
- _closeCallback(trailingMetadata, error);
- }
+ dispatch_async(_dispatchQueue, ^{
+ if (_closeCallback) {
+ _closeCallback(trailingMetadata, error);
+ }
+ });
}
- (dispatch_queue_t)dispatchQueue {