Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios PromiseKit 4-包装委托书_Ios_Swift_Delegates_Singleton_Promisekit - Fatal编程技术网

Ios PromiseKit 4-包装委托书

Ios PromiseKit 4-包装委托书,ios,swift,delegates,singleton,promisekit,Ios,Swift,Delegates,Singleton,Promisekit,我正在尝试使用Promisekit实现带有Wrap委托的单例 我成功地实现了如下所述: 它可以工作,但承诺保留了第一次调用的值。它不会更新价值 示例代码: open class APIClient: NSObject { static let sharedInstance = APIClient() var mSocket: GCDAsyncSocket! var deferred = Promise<[String:Any]>.pending()

我正在尝试使用Promisekit实现带有Wrap委托的单例

我成功地实现了如下所述:

它可以工作,但承诺保留了第一次调用的值。它不会更新价值

示例代码:

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

}
开放类APIClient:NSObject{
静态let sharedInstance=APIClient()
var mSocket:GCDAsyncSocket!
var deferred=Promise.pending()
var retainCycle:NSObject?
重写init(){
mSocket=GCDAsyncSocket()
super.init()
setDelegate(self,delegateQueue:DispatchQueue.main)
推迟,承诺,永远{
print(self)//这里我们强制在promise对象内保留self
//它将在处理后发布
}.catch{(错误)在
}
}
//MARK:-sendMessageTCP
打开func sendMessageTCP(消息数据:数据)->Promise{
mSocket.write(数据,带超时:10,标记:0)
延期退换货
}
}
扩展APIClient:GCDAsyncSocketDelegate{
公共函数套接字(usock:GCDAsyncSocket,didWriteDataWithTag:Int){
sock.readData(带超时:-1,标记:0)
}
公共函数套接字(usock:GCDAsyncSocket,didRead data:data,带tag-tag:Int){
让数组=data.withUnsafeBytes{
[UInt8](UnsafeBufferPointer(开始:$0,计数:data.count))
}
let参数:[字符串:任意]=[
“状态”:正确,
“数据”:bytesToHexString(字节:数组),
“ui_消息”:“读取数据”
]
延迟。完成(参数)
复周期=零
}
private func bytestoExString(字节:[UInt8])->String{
返回字节。映射{String(格式:'%02X',$0)}。已加入(分隔符:“”)
}
}

承诺只能实现一次,因此仅适用于实现一次的系统。对于套接字之类的东西,应该使用另一种异步模式,如完成块