2016-10-06 3 views
-1

haben die folgende Funktion. Ich bin auf der Suche nach dem Ergebnis der Funktion als ein Int nach der Beendigung der Thread-Ausführung. Es fragt eine Variable von einem externen Gerät ab. Wenn ich die Funktion get-Variable aufruft, erhalte ich sofort das Ergebnis -1, und einige Sekunden danach erhalte ich das Ergebnis vom Abschluss-Thread. Wie kann ich dies neu bearbeiten, so dass kein Ergebnis zurückgegeben wird, bis der tatsächliche Wert zurückgegeben wird? noch ein noob mit swift3 und GCD..thanksSwift - Rückgabevariable von innerhalb der Schließung

func getVariable(variableName: String) -> Int { 
    var res: Int = -1 
    print (deviceOK) 
    if deviceOK { 
     DispatchQueue.global(qos: .default).async { 
      // logging in 
      (self.deviceGroup).wait(timeout: DispatchTime.distantFuture) 
      (self.deviceGroup).enter() 

      self.myPhoton!.getVariable(variableName, completion: { (result:Any?, error:Error?) -> Void in 
       if let _ = error { 
        print("Failed reading variable " + variableName + " from device") 
       } else { 
        if let res = result! as? Int { 
         print("Variable " + variableName + " value is \(res)") 
         self.deviceGroup.leave() 
        } 
       } 
      }) 
     } 
    } 

    return res 
} 
+0

Rufen Sie die Funktion auf einem Hintergrundthread auf. –

Antwort

0

Sie sollten Ihre GetVariable-Funktion mit einem Beendigungshandler ausführen, anstatt einen Int.

4

Vielleicht können Sie Abschluss selbst blockieren verwenden:

func getVariable(variableName: String, onComplete: ((Int) ->())) { 
    var res: Int = -1 
    print (deviceOK) 
    if deviceOK { 
     DispatchQueue.global(qos: .default).async { 
      // logging in 
      (self.deviceGroup).wait(timeout: DispatchTime.distantFuture) 
      (self.deviceGroup).enter() 

      self.myPhoton!.getVariable(variableName, completion: { (result:Any?, error:Error?) -> Void in 
       if let _ = error { 
        print("Failed reading variable " + variableName + " from device") 
       } else { 
        if let res = result! as? Int { 
         onComplete(res) 
         print("Variable " + variableName + " value is \(res)") 
         self.deviceGroup.leave() 
        } 
       } 
      }) 
     } 
    } else { 
     onComplete(res) 
    } 
} 

Ein weiterer Ansatz ist Promises zu verwenden, einen Blick auf diese Implementierung nehmen: https://github.com/FutureKit/FutureKit

Verwandte Themen