我需要调用:
[self performSelectorOnMainThread:@selector(chooseURL:) withObject:myIndex waitUntilDone:YES];
但我的问题是myIndex
是一个int
,而不是一个对象。是否有解决方法?
答案 0 :(得分:5)
您必须将int包装在对象中,因为int是基本类型而不是对象。例如:
[self performSelectorOnMainThread:@selector(chooseURL:)
withObject:[NSNumber numberWithInt:myIndex]
waitUntilDone:YES];
当然,您必须编辑您的chooseURL:方法以接受NSNumber而不是int。 打开包装:
int myInt = [myIndex intValue];
答案 1 :(得分:2)
从int
创建一个NSNumber[NSNumber numberWithInt:myInt];
答案 2 :(得分:2)
使用performSelectorOnMainThread:...
的GCD版本:
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()
, 可以在同一个帖子中使用。
答案 3 :(得分:1)
NSNumber可以归类为对象,因此请使用[NSNumber numberwithint:myindex]