我拥有一个同时发送文件到Web服务器(图像,文本,音频)的应用程序,而不是权衡主线程,我想我会在苹果线程中的现有设备之间分配这些操作。 / p>
我在调试中看到xcode模拟器有5个线程,我尝试这样做:
[self performSelector:@selector(SendImages) onThread:1 withObject:nil waitUntilDone:NO];
[self performSelector:@selector(SendText) onThread:2 withObject:nil waitUntilDone:NO];
[self performSelector:@selector(SendAudio) onThread:3 withObject:nil waitUntilDone:NO];
在这段代码中,我使用3个线程来执行不同的功能,但是我对这段代码有两个问题:
将“int”发送到参数的指针转换不兼容 类型'NSThread *'
线程1:EXC_BAD_ACCESS(代码= 2;地址= 0x3)
我该如何解决这个问题? (ARC在我的项目中禁用)
答案 0 :(得分:0)
为了使用performSelector:onThread:withObject:waitUntilDone:
,您需要对NSThread
对象的引用,而不是整数(可能您认为这是一个线程数组的索引?)。
如果您想在后台线程上执行这些操作,最好使用NSInvocationOperation
和NSOperationQueue
,操作系统将为您管理后台线程。
例如:
@property (nonatomic, retain) NSOperationQueue *queue;
...
queue = [NSOperationQueue new];
[queue setMaxConcurrentOperationCount:3];
NSInvocationOperation *operationImages = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(SendImages) object:nil] autorelease];
NSInvocationOperation *operationText = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(SendText) object:nil] autorelease];
NSInvocationOperation *operationAudio = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(SendAudio) object:nil] autorelease];
[queue addOperation:operationImages];
[queue addOperation:operationText];
[queue addOperation:operationAudio];