如何在iOS中的线程之间传输数据?

时间:2011-08-12 01:45:20

标签: java iphone objective-c ios

在Java中,线程安全PipedInputStreamPipedOutputStream类可用于将数据从一个线程传输到另一个线程。在iOS中它的等价物是什么?

如果我错了,请纠正我,但我的理解是来自Cocoa的NSPipe仅用于进程之间的数据传输,但不用于线程之间。另外,由于它为此使用了一些本地目录,我假设某些临时文件用于此类传输。总结一下,

  1. 假设使用了Operation Queues,我可以在Cocoa中使用哪个类将二进制数据从一个线程传输到 另一个没有写我自己的同步和没有制作 使用临时文件?
  2. 如果没有,那么优雅的选择是什么?

2 个答案:

答案 0 :(得分:4)

与使用fork创建的POSIX线程不同,Java线程是轻量级的,并且共享相同的地址空间。在Java中不需要C-Style IPC,并且绝对不是为此目的创建PipedInputStream / PipedOutputStream。 Objective-C线程构建在POSIX上,但它们都共享相同的虚拟内存空间,因此您通常在ObjC中执行任何IPC。

如果您希望在Objective C中的线程之间“共享”数据,只需将其写入适当的变量,并在必要时在线程之间发送可用数据的信号。最好的方法是使用条件。

如果您打算在Obj C中进行任何非平凡的线程工作,那么我强烈建议您阅读Apple's guide on thread safety

答案 1 :(得分:1)

在线程之间传输数据的最简单方法是使用NSData对象和performSelector:onThread:withObject。

performSelector:onThread:withObject:waitUntilDone:modes

假设你有两个线程,threadX和threadY,每个线程都有一个对象,objectX和objectY。做类似的事情:

char buffer[100] = "Hello";
NSData *data = [NSData dataWithBytes:byBuffer length:100];
[objectY performSelector:@selector(haveSomeData:) onThread:threadY withObject:data waitUntilDone:NO modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]];