2016-10-11 2 views
1

나는 이것을 구현하기 위해 관리 : https://github.com/mxcl/PromiseKit/issues/136PromiseKit 4 여기에 설명 된대로 랩 위임 내가 Promisekit</p> <p>을 사용하여 랩 대표와 싱글 톤을 구현하기 위해 노력하고

그것은 작동하지만, 약속은의 값을 유지 첫 번째 전화. 그것은 가치를 갱신하지 않습니다.

샘플 코드 :

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: "") 
    } 

} 

답변

1

약속 한 번만 성취 따라서 한 번 수행 시스템에만 적합 할 수 있습니다. 소켓과 같은 것에 대해서는 완료 블록과 같은 다른 비동기 패턴을 사용해야합니다.