我在我的应用程序中使用GCDAsyncSocket
( CocoaAsyncSocket
) 进行套接字通信。由于 的异步特性GCDAsyncSocket
,我的网络请求(submitMessage
如下)与接收数据时运行的回调块(socket:didReadData
)分离。
- (void)submitMessage:(NSDictionary *)messageObject onCompletion:(completionBlock)block {
...
[_socket writeData:requestData withTimeout:self.timeout tag:0];
[_socket readDataToLength:4 withTimeout:self.timeout tag:TAG_HEADER];
}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
...
NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if (self.completionBlock != nil)
self.completionBlock(responseObject);
}
}
这种方法适用于一次性交易。但是在某些情况下,我需要发布一个请求,然后使用接收到的数据,发布另一个请求。我无法让它正常工作。基本上,我需要这样的东西:
[self submitMessage:request1 onCompletion:^(NSDictionary *response1) {
(...callback 1...)
}];
[self submitMessage:request2 onCompletion:^(NSDictionary *response2) {
(...callback 2...)
}];
}];
或者
[self submitMessage:request1 onCompletion:^(NSDictionary *response1) {
(...callback 1...)
}];
[self submitMessage:request2 onCompletion:^(NSDictionary *response2) {
(...callback 2...)
}];
严格的顺序是 request1 - callback1 - request2 - callback2。
那么问题来了,如何在第一个请求回调后阻止第二个请求运行呢?GCD
(?dispatch_sync
)会是要走的路吗?
编辑
我最终使用了类似于@tigloo 建议的解决方案(因此接受了他的回答),但使用NSCondition
了代替GCD
(如果有人对细节感兴趣,我遵循了这个很棒的讨论)。我已经在运行多个线程(主线程中的 UI,另一个线程中的高级套接字通信,以及第三个线程中的套接字操作)。设置类属性并使用NSCondition
锁定GCDAsyncSocket
委托直到响应到达似乎是最干净的方法。