Procházet zdrojové kódy

Make all run() methods in generated client code synchronous.

Tim Burks před 9 roky
rodič
revize
cb270e9df0

+ 27 - 3
Examples/Echo/Swift/Generated/echo.client.pb.swift

@@ -99,10 +99,18 @@ public class Echo_EchoExpandCall {
   // Call this once with the message to send.
   fileprivate func run(request: Echo_EchoRequest, metadata: Metadata) throws -> Echo_EchoExpandCall {
     let requestData = try request.serializeProtobuf()
+    let done = NSCondition()
     try call.start(.serverStreaming,
                    metadata:metadata,
                    message:requestData)
-    {_ in}
+    {callResult in
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
     return self
   }
 
@@ -147,9 +155,17 @@ public class Echo_EchoCollectCall {
 
   // Call this to start a call.
   fileprivate func run(metadata:Metadata) throws -> Echo_EchoCollectCall {
+    let done = NSCondition()
     try self.call.start(.clientStreaming,
                         metadata:metadata)
-    {_ in}
+    {callResult in
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
     return self
   }
 
@@ -200,9 +216,17 @@ public class Echo_EchoUpdateCall {
   }
 
   fileprivate func run(metadata:Metadata) throws -> Echo_EchoUpdateCall {
+    let done = NSCondition()
     try self.call.start(.bidiStreaming,
                         metadata:metadata)
-    {_ in}
+    {callResult in
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
     return self
   }
 

+ 37 - 15
Examples/Echo/Swift/Xcode/Echo/EchoViewController.swift

@@ -160,30 +160,52 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
     else if (self.callSelectButton.selectedSegment == 1) {
       // STREAMING EXPAND
       if (!nowStreaming) {
-        let requestMessage = Echo_EchoRequest(text:self.messageField.stringValue)
-        self.expandCall = try service.expand(requestMessage)
-        self.displayMessageSent(requestMessage.text)
-        try self.receiveExpandMessages()
+        DispatchQueue.global().async {
+          do {
+            let requestMessage = Echo_EchoRequest(text:self.messageField.stringValue)
+            self.expandCall = try service.expand(requestMessage)
+            self.displayMessageSent(requestMessage.text)
+            try self.receiveExpandMessages()
+          } catch (let error) {
+            self.displayMessageReceived("No message received. \(error)")
+          }
+        }
       }
     }
     else if (self.callSelectButton.selectedSegment == 2) {
       // STREAMING COLLECT
-      if (!nowStreaming) {
-        collectCall = try service.collect()
-        nowStreaming = true
-        closeButton.isEnabled = true
+      DispatchQueue.global().async {
+        do {
+          if (!self.nowStreaming) {
+            self.collectCall = try service.collect()
+            self.nowStreaming = true
+            DispatchQueue.main.async {
+              self.closeButton.isEnabled = true
+            }
+          }
+          try self.sendCollectMessage()
+        } catch (let error) {
+          self.displayMessageReceived("No message received. \(error)")
+        }
       }
-      try self.sendCollectMessage()
     }
     else if (self.callSelectButton.selectedSegment == 3) {
       // STREAMING UPDATE
-      if (!nowStreaming) {
-        updateCall = try service.update()
-        try self.receiveUpdateMessages()
-        nowStreaming = true
-        closeButton.isEnabled = true
+      DispatchQueue.global().async {
+        do {
+          if (!self.nowStreaming) {
+            self.updateCall = try service.update()
+            try self.receiveUpdateMessages()
+            self.nowStreaming = true
+            DispatchQueue.main.async {
+              self.closeButton.isEnabled = true
+            }
+          }
+          try self.sendUpdateMessage()
+        } catch (let error) {
+          self.displayMessageReceived("No message received. \(error)")
+        }
       }
-      try self.sendUpdateMessage()
     }
   }
 

+ 9 - 1
Plugin/swiftgrpc.templates/client-call-bidistreaming.swift

@@ -8,9 +8,17 @@ public class {{ .|call:protoFile,service,method }} {
   }
 
   fileprivate func run(metadata:Metadata) throws -> {{ .|call:protoFile,service,method }} {
+    let done = NSCondition()
     try self.call.start(.bidiStreaming,
                         metadata:metadata)
-    {_ in}
+    {callResult in
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
     return self
   }
 

+ 9 - 1
Plugin/swiftgrpc.templates/client-call-clientstreaming.swift

@@ -9,9 +9,17 @@ public class {{ .|call:protoFile,service,method }} {
 
   // Call this to start a call.
   fileprivate func run(metadata:Metadata) throws -> {{ .|call:protoFile,service,method }} {
+    let done = NSCondition()
     try self.call.start(.clientStreaming,
                         metadata:metadata)
-    {_ in}
+    {callResult in
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
     return self
   }
 

+ 9 - 1
Plugin/swiftgrpc.templates/client-call-serverstreaming.swift

@@ -10,10 +10,18 @@ public class {{ .|call:protoFile,service,method }} {
   // Call this once with the message to send.
   fileprivate func run(request: {{ method|input }}, metadata: Metadata) throws -> {{ .|call:protoFile,service,method }} {
     let requestData = try request.serializeProtobuf()
+    let done = NSCondition()
     try call.start(.serverStreaming,
                    metadata:metadata,
                    message:requestData)
-    {_ in}
+    {callResult in
+      done.lock()
+      done.signal()
+      done.unlock()
+    }
+    done.lock()
+    done.wait()
+    done.unlock()
     return self
   }
 

+ 8 - 5
Sources/gRPC/Call.swift

@@ -111,7 +111,11 @@ public struct CallResult {
 
   fileprivate init(_ op : OperationGroup) {
     if (op.success) {
-      self.statusCode = op.receivedStatusCode()!
+      if let statusCode = op.receivedStatusCode() {
+        self.statusCode = statusCode
+      } else {
+        self.statusCode = 0
+      }
       self.statusMessage = op.receivedStatusMessage()
       self.resultData = op.receivedMessage()?.data()
       self.initialMetadata = op.receivedInitialMetadata()
@@ -218,13 +222,12 @@ public class Call {
         }
         operations = [.sendInitialMetadata(metadata.copy() as! Metadata),
                       .receiveInitialMetadata,
-                      .receiveStatusOnClient,
                       .sendMessage(ByteBuffer(data:message)),
-                      .sendCloseFromClient]
+                      .sendCloseFromClient
+        ]
       case .clientStreaming, .bidiStreaming:
         operations = [.sendInitialMetadata(metadata.copy() as! Metadata),
-                      .receiveInitialMetadata,
-                      .receiveStatusOnClient]
+                      .receiveInitialMetadata]
       }
       try self.perform(OperationGroup(call:self,
                                       operations:operations,