2016-10-11 2 views
1

IPromiseKit 4 - Wrap Delegation

ein Singleton mit Wrap Delegation mit Promisekit zu implementieren versuche

schaffe ich dies zu implementieren, wie hier beschrieben: https://github.com/mxcl/PromiseKit/issues/136

Es funktioniert, aber das Versprechen, den Wert aus der Retain erster Aufruf. Es erneuert den Wert nicht.

Beispielcode:

open class APIClient: NSObject { 


    static let sharedInstance = APIClient() 
    var mSocket: GCDAsyncSocket! 
    var deferred = Promise<[String:Any]>.pending() 
    var retainCycle: NSObject? 

    override init() { 
     mSocket = GCDAsyncSocket() 
     super.init() 
     mSocket.setDelegate(self, delegateQueue: DispatchQueue.main) 
     deferred.promise.always { 
      print(self) // here we force a retain on self inside the promise object 
      // it will be released once processed 
     }.catch { (error) in 

     } 
    } 


    // MARK: - sendMessageTCP 
    open func sendMessageTCP(message data:Data) -> Promise<[String:Any]> { 
     mSocket.write(data, withTimeout: 10, tag: 0) 
     return deferred.promise 
    } 

} 

extension APIClient: GCDAsyncSocketDelegate { 

    public func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) { 
     sock.readData(withTimeout: -1, tag: 0) 
    } 

    public func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) { 
     let array = data.withUnsafeBytes { 
      [UInt8](UnsafeBufferPointer(start: $0, count: data.count)) 
     } 
     let parameters: [String:Any] = [ 
      "status": true, 
      "data": bytesToHexString(bytes: array), 
      "ui_message": "Read Data" 
     ] 
     deferred.fulfill(parameters) 
     retainCycle = nil 
    } 

    private func bytesToHexString(bytes: [UInt8]) -> String { 
     return bytes.map{String(format: "%02X", $0)}.joined(separator: "") 
    } 

} 

Antwort

1

Promises nur einmal erfüllt werden können und somit nur für Systeme geeignet, die einmal erfüllen. Für etwas wie einen Socket sollten Sie ein anderes asynchrones Muster, wie Abschlussblöcke, verwenden.