gpt4 book ai didi

ios - 使用GCDAsyncSocket进行同步通信

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:10:28 25 4
gpt4 key购买 nike

我在我的应用程序中使用 GCDAsyncSocket (CocoaAsyncSocket) 进行套接字通信。由于 GCDAsyncSocket 的异步特性,我的网络请求(下面的 submitMessage)与接收数据时运行的回调 block (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...)
}];

顺序严格为请求 1 - 回调 1 - 请求 2 - 回调 2。

那么问题来了,如何在第一个请求回调后阻止第二个请求运行呢? GCD(dispatch_sync?)是可行的方法吗?

编辑

我最终使用了类似于@tigloo 建议的解决方案(因此接受了他的回答),但使用了 NSCondition 而不是 GCD(如果有人对细节感兴趣,我跟随 this great discussion )。我已经在运行多个线程(主线程中的 UI,另一个线程中的高级套接字通信,以及第三个线程中的套接字操作)。设置类属性并使用 NSCondition 锁定 GCDAsyncSocket 委托(delegate)直到响应到达似乎是最简洁的方法。

最佳答案

我想你快到了。怎么样

[self submitMessage:request1 onCompletion:^(NSDictionary *response1) {
// here, do something with response1 and create request2...
// then you can make request2 directly at the end of the callback:
[self submitMessage:request2 onCompletion:^(NSDictionary *response2) {
// here, do something with response2...
}];
}];

不需要 GCD 指令,不需要阻止执行(无论如何这是一种不好的做法)。这是否解决了您的问题?

关于ios - 使用GCDAsyncSocket进行同步通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16143516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com