gpt4 book ai didi

iphone - 在 iPhone 上使用带有辅助线程的 AsyncSocket

转载 作者:行者123 更新时间:2023-12-03 19:02:30 26 4
gpt4 key购买 nike

我在 iPhone 上使用 AsyncSocket 与服务器通信。 AsyncSocket 基于运行循环,但我的应用程序基于线程。这意味着,我启动一个新线程来写入数据并等待,直到在同一线程上收到响应。但我不能直接从另一个线程调用 AsyncSocket 的方法,我必须使用:

[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES];

它确实有效,但我无法从以这种方式调用的方法“writeSomeData:”中获得响应,因为performSelectorOnMainThread没有返回任何内容。

writeSomeData: 方法执行如下操作:

-(NSData *)writeData:(NSData *)dataToWrite {
dataReceived = nil; // AsyncSocket writes data to this variable
[asyncSocket writeData:dataToWrite withTimeout:-1 tag:0];
[asyncSocket readDataToData:[@"<EOF" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
int counter = 0;
while (dataReceived == nil && counter < 5) {
// runLoop is [NSRunLoop currentRunloop]
[runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.3]];
++counter;
}

return [dataReceived copy];
}

我可以通过访问类变量“dataReceived”来获取响应,但此时它的内容发生了变化。

任何人都可以告诉我如何在单独的线程上使用 AsyncSocket (或者通常如何处理基于运行循环的类),这样如果我调用该类的方法,它就会阻塞,直到执行该方法并收到响应为止?

谢谢。

最佳答案

尝试使用GCD(Grand Central Dispatch)在单独的线程上写入数据,然后在写入数据时返回主线程。你可以这样做:

// call this on the main thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSData *data = [self writeData:dataToWrite];
dispatch_async(dispatch_get_main_queue(), ^{
// do something with the data on the main thread.
});
});

我希望这样的事情可以帮助你......

关于iphone - 在 iPhone 上使用带有辅助线程的 AsyncSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725042/

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