我需要调用:
[self performSelectorOnMainThread:@selector(chooseURL:) withObject:myIndex waitUntilDone:YES];
但我的问题是它myIndex
是一个int
,而不是一个对象。有解决方法吗?
我需要调用:
[self performSelectorOnMainThread:@selector(chooseURL:) withObject:myIndex waitUntilDone:YES];
但我的问题是它myIndex
是一个int
,而不是一个对象。有解决方法吗?
您必须将 int 包装在对象中,因为 int 是原始类型而不是对象。例如:
[self performSelectorOnMainThread:@selector(chooseURL:)
withObject:[NSNumber numberWithInt:myIndex]
waitUntilDone:YES];
当然,您必须编辑您的 chooseURL: 方法以接受 NSNumber 而不是 int。展开:
int myInt = [myIndex intValue];
从 int 创建一个 NSNumber
[NSNumber numberWithInt:myInt];
使用 GCD 版本performSelectorOnMainThread:...
:
dispatch_sync(dispatch_get_main_queue(), ^{
[self chooseURL:myIndex];
});
主队列始终在主线程上。
dispatch_sync()
当你已经在主线程上时不要使用,否则你会死锁。必要时检查:
dispatch_queue_t mainQ = dispatch_get_main_queue();
if( mainQ != dispatch_get_current_queue() ){
dispatch_sync(mainQ, ^{
[self chooseURL:myIndex];
});
}
else {
[self chooseURL:myIndex];
}
对于waitUntilDone:NO
,您可以使用dispatch_async()
,可以在同一个线程中使用。
NSNumber 可以归类为对象,因此请使用 [NSNumber numberwithint:myindex]