1

Promisekit を使用してラップ委任でシングルトンを実装しようとしています

ここで説明されているように、これを実装することができます: https://github.com/mxcl/PromiseKit/issues/136

動作しますが、promise は最初の呼び出しの値を保持します。値を更新しません。

サンプルコード:

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

}
4

1 に答える 1

1

Promise は 1 回しか履行できないため、1 回しか履行しないシステムにのみ適しています。ソケットのようなものには、完了ブロックのような別の非同期パターンを使用する必要があります。

于 2016-10-12T16:15:31.853 に答える