Jelajahi Sumber

cleanup EchoViewController

Tim Burks 9 tahun lalu
induk
melakukan
b05b0ad416
1 mengubah file dengan 35 tambahan dan 11 penghapusan
  1. 35 11
      Examples/Echo/Swift/Echo/EchoViewController.swift

+ 35 - 11
Examples/Echo/Swift/Echo/EchoViewController.swift

@@ -41,10 +41,10 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
   @IBOutlet weak var streamingButton: NSButton!
   @IBOutlet weak var TLSButton: NSButton!
 
-  private var streaming = false
-  var client: Client!
-  var call: Call!
-  var fileDescriptorSet : FileDescriptorSet
+  private var fileDescriptorSet : FileDescriptorSet
+  private var client: Client?
+  private var call: Call?
+  private var nowStreaming = false
 
   required init?(coder:NSCoder) {
     fileDescriptorSet = FileDescriptorSet(filename: "echo.out")
@@ -60,13 +60,13 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
   }
 
   @IBAction func addressReturnPressed(sender: NSTextField) {
-    if (streaming) {
+    if (nowStreaming) {
       self.sendClose()
     }
   }
 
   @IBAction func buttonValueChanged(sender: NSButton) {
-    if (streaming && (sender.intValue == 0)) {
+    if (nowStreaming && (sender.intValue == 0)) {
       self.sendClose()
     }
   }
@@ -76,6 +76,7 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
   }
 
   override func viewDidAppear() {
+    // prevent the UI from trying to send messages until gRPC is initialized
     DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
       self.enabled = true
     }
@@ -102,9 +103,15 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
         requestMessage.addField("text", value:self.messageField.stringValue)
         let requestMessageData = requestMessage.data()
         createClient(address:address, host:requestHost)
+        guard let client = client else {
+          return
+        }
         call = client.createCall(host: requestHost,
                                  method: "/echo.Echo/Get",
                                  timeout: 30.0)
+        guard let call = call else {
+          return
+        }
         _ = call.performNonStreamingCall(messageData: requestMessageData,
                                          metadata: requestMetadata)
         { (status, statusDetails, messageData, initialMetadata, trailingMetadata) in
@@ -127,14 +134,20 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
     }
     else {
       // STREAMING
-      if (!streaming) {
+      if (!nowStreaming) {
         createClient(address:address, host:requestHost)
+        guard let client = client else {
+          return
+        }
         call = client.createCall(host: requestHost,
                                  method: "/echo.Echo/Update",
                                  timeout: 30.0)
+        guard let call = call else {
+          return
+        }
         _ = call.start(metadata:requestMetadata)
         self.receiveMessage()
-        streaming = true
+        nowStreaming = true
       }
       self.sendMessage()
     }
@@ -144,12 +157,20 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
     let requestMessage = self.fileDescriptorSet.createMessage("EchoRequest")!
     requestMessage.addField("text", value:self.messageField.stringValue)
     let messageData = requestMessage.data()
-    call.sendMessage(data:messageData)
+    if let call = call {
+      call.sendMessage(data:messageData)
+    }
   }
 
   func receiveMessage() {
+    guard let call = call else {
+      return
+    }
     _ = call.receiveMessage() {(data) in
-      let responseMessage = self.fileDescriptorSet.readMessage("EchoResponse", data:data)!
+      guard let responseMessage = self.fileDescriptorSet.readMessage("EchoResponse", data:data)
+        else {
+          return // this stops receiving
+      }
       responseMessage.forOneField("text") {(field) in
         DispatchQueue.main.async {
           self.outputField.stringValue = field.string()
@@ -160,8 +181,11 @@ class EchoViewController : NSViewController, NSTextFieldDelegate {
   }
 
   func sendClose() {
+    guard let call = call else {
+      return
+    }
     _ = call.close() {
-      self.streaming = false
+      self.nowStreaming = false
     }
   }
 }