Ios PromiseKit 4-包装委托书
我正在尝试使用Promisekit实现带有Wrap委托的单例 我成功地实现了如下所述: 它可以工作,但承诺保留了第一次调用的值。它不会更新价值 示例代码: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()
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)}。已加入(分隔符:“”)
}
}
承诺只能实现一次,因此仅适用于实现一次的系统。对于套接字之类的东西,应该使用另一种异步模式,如完成块