在iPhone上使用AsyncSocket和辅助线程

Art*_*hur 5 iphone cocoa-touch asyncsocket nsthread nsrunloop

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

[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

它确实有效,但我无法通过这种方式调用我的方法"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];
}
Run Code Online (Sandbox Code Playgroud)

我可以通过访问类变量"dataReceived"获得响应,但此时内容已更改.

任何人都可以告诉我如何在不同的线程上使用AsyncSocket(或者一般来说,如何处理基于运行循环的类),这样如果我调用该类的方法,它会一直阻塞,直到执行该方法并收到响应?

谢谢.

Mih*_*atu -1

尝试使用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.
    });
});
Run Code Online (Sandbox Code Playgroud)

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