aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/objective-c/ProtoRPC
diff options
context:
space:
mode:
authorGravatar Muxi Yan <mxyan@google.com>2018-10-16 15:34:39 -0700
committerGravatar Muxi Yan <mxyan@google.com>2018-10-16 15:34:39 -0700
commitbf092064962664a1a949750c9f9b273f7d27c529 (patch)
treea91fa94f703d0b81a49bed32a7e497a36e82a527 /src/objective-c/ProtoRPC
parente69a7cc7f7497e67232843a3843f543740480c4e (diff)
Separate GRPCProtoResponseHandler from GRPCResponseHandler
Diffstat (limited to 'src/objective-c/ProtoRPC')
-rw-r--r--src/objective-c/ProtoRPC/ProtoRPC.h37
-rw-r--r--src/objective-c/ProtoRPC/ProtoRPC.m76
2 files changed, 77 insertions, 36 deletions
diff --git a/src/objective-c/ProtoRPC/ProtoRPC.h b/src/objective-c/ProtoRPC/ProtoRPC.h
index a045ef10a6..d20098ce8c 100644
--- a/src/objective-c/ProtoRPC/ProtoRPC.h
+++ b/src/objective-c/ProtoRPC/ProtoRPC.h
@@ -23,6 +23,39 @@
@class GPBMessage;
+/** An object can implement this protocol to receive responses from server from a call. */
+@protocol GRPCProtoResponseHandler <NSObject>
+
+@optional
+
+/** Issued when initial metadata is received from the server. */
+- (void)receivedInitialMetadata:(NSDictionary *)initialMetadata;
+
+/**
+ * Issued when a message is received from the server. The message is the deserialized proto object.
+ */
+- (void)receivedProtoMessage:(id)message;
+
+/**
+ * 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.
+ */
+- (void)closedWithTrailingMetadata:(NSDictionary *)trailingMetadata error:(NSError *)error;
+
+@required
+
+/**
+ * All the responses must be issued to a user-provided dispatch queue. This property specifies the
+ * dispatch queue to be used for issuing the notifications. A serial queue should be provided if
+ * the order of responses (initial metadata, message, message, ..., message, trailing metadata)
+ * needs to be maintained.
+ */
+@property(atomic, readonly) dispatch_queue_t dispatchQueue;
+
+@end
+
/** A unary-request RPC call with Protobuf. */
@interface GRPCUnaryProtoCall : NSObject
@@ -36,7 +69,7 @@
*/
- (instancetype)initWithRequestOptions:(GRPCRequestOptions *)requestOptions
message:(GPBMessage *)message
- responseHandler:(id<GRPCResponseHandler>)handler
+ responseHandler:(id<GRPCProtoResponseHandler>)handler
callOptions:(GRPCCallOptions *)callOptions
responseClass:(Class)responseClass NS_DESIGNATED_INITIALIZER;
@@ -57,7 +90,7 @@
* returned to users by methods of the generated service.
*/
- (instancetype)initWithRequestOptions:(GRPCRequestOptions *)requestOptions
- responseHandler:(id<GRPCResponseHandler>)handler
+ responseHandler:(id<GRPCProtoResponseHandler>)handler
callOptions:(GRPCCallOptions *)callOptions
responseClass:(Class)responseClass NS_DESIGNATED_INITIALIZER;
diff --git a/src/objective-c/ProtoRPC/ProtoRPC.m b/src/objective-c/ProtoRPC/ProtoRPC.m
index 957d636534..7a57affbf1 100644
--- a/src/objective-c/ProtoRPC/ProtoRPC.m
+++ b/src/objective-c/ProtoRPC/ProtoRPC.m
@@ -33,7 +33,7 @@
- (instancetype)initWithRequestOptions:(GRPCRequestOptions *)requestOptions
message:(GPBMessage *)message
- responseHandler:(id<GRPCResponseHandler>)handler
+ responseHandler:(id<GRPCProtoResponseHandler>)handler
callOptions:(GRPCCallOptions *)callOptions
responseClass:(Class)responseClass {
if ((self = [super init])) {
@@ -60,7 +60,7 @@
@implementation GRPCStreamingProtoCall {
GRPCRequestOptions *_requestOptions;
- id<GRPCResponseHandler> _handler;
+ id<GRPCProtoResponseHandler> _handler;
GRPCCallOptions *_callOptions;
Class _responseClass;
@@ -69,7 +69,7 @@
}
- (instancetype)initWithRequestOptions:(GRPCRequestOptions *)requestOptions
- responseHandler:(id<GRPCResponseHandler>)handler
+ responseHandler:(id<GRPCProtoResponseHandler>)handler
callOptions:(GRPCCallOptions *)callOptions
responseClass:(Class)responseClass {
if ((self = [super init])) {
@@ -98,16 +98,18 @@
_call = nil;
}
if (_handler) {
- id<GRPCResponseHandler> handler = _handler;
- dispatch_async(handler.dispatchQueue, ^{
- [handler closedWithTrailingMetadata:nil
- error:[NSError errorWithDomain:kGRPCErrorDomain
- code:GRPCErrorCodeCancelled
- userInfo:@{
- NSLocalizedDescriptionKey :
- @"Canceled by app"
- }]];
- });
+ id<GRPCProtoResponseHandler> handler = _handler;
+ if ([handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
+ dispatch_async(handler.dispatchQueue, ^{
+ [handler closedWithTrailingMetadata:nil
+ error:[NSError errorWithDomain:kGRPCErrorDomain
+ code:GRPCErrorCodeCancelled
+ userInfo:@{
+ NSLocalizedDescriptionKey :
+ @"Canceled by app"
+ }]];
+ });
+ }
_handler = nil;
}
});
@@ -136,27 +138,33 @@
- (void)receivedInitialMetadata:(NSDictionary *)initialMetadata {
if (_handler) {
- id<GRPCResponseHandler> handler = _handler;
- dispatch_async(handler.dispatchQueue, ^{
- [handler receivedInitialMetadata:initialMetadata];
- });
+ id<GRPCProtoResponseHandler> handler = _handler;
+ if ([handler respondsToSelector:@selector(initialMetadata:)]) {
+ dispatch_async(handler.dispatchQueue, ^{
+ [handler receivedInitialMetadata:initialMetadata];
+ });
+ }
}
}
-- (void)receivedMessage:(NSData *)message {
+- (void)receivedRawMessage:(NSData *)message {
if (_handler) {
- id<GRPCResponseHandler> handler = _handler;
+ id<GRPCProtoResponseHandler> handler = _handler;
NSError *error = nil;
id parsed = [_responseClass parseFromData:message error:&error];
if (parsed) {
- dispatch_async(handler.dispatchQueue, ^{
- [handler receivedMessage:parsed];
- });
+ if ([handler respondsToSelector:@selector(receivedProtoMessage:)]) {
+ dispatch_async(handler.dispatchQueue, ^{
+ [handler receivedProtoMessage:parsed];
+ });
+ }
} else {
- dispatch_async(handler.dispatchQueue, ^{
- [handler closedWithTrailingMetadata:nil error:error];
- });
- handler = nil;
+ if ([handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
+ dispatch_async(handler.dispatchQueue, ^{
+ [handler closedWithTrailingMetadata:nil error:error];
+ });
+ }
+ _handler = nil;
[_call cancel];
_call = nil;
}
@@ -165,16 +173,16 @@
- (void)closedWithTrailingMetadata:(NSDictionary *)trailingMetadata error:(NSError *)error {
if (_handler) {
- id<GRPCResponseHandler> handler = _handler;
- dispatch_async(handler.dispatchQueue, ^{
- [handler closedWithTrailingMetadata:trailingMetadata error:error];
- });
+ id<GRPCProtoResponseHandler> handler = _handler;
+ if ([handler respondsToSelector:@selector(closedWithTrailingMetadata:error:)]) {
+ dispatch_async(handler.dispatchQueue, ^{
+ [handler closedWithTrailingMetadata:trailingMetadata error:error];
+ });
+ }
_handler = nil;
}
- if (_call) {
- [_call cancel];
- _call = nil;
- }
+ [_call cancel];
+ _call = nil;
}
- (dispatch_queue_t)dispatchQueue {