1

我需要调用:

[self performSelectorOnMainThread:@selector(chooseURL:) withObject:myIndex waitUntilDone:YES];

但我的问题是它myIndex是一个int,而不是一个对象。有解决方法吗?

4

4 回答 4

5

您必须将 int 包装在对象中,因为 int 是原始类型而不是对象。例如:

[self performSelectorOnMainThread:@selector(chooseURL:) 
                       withObject:[NSNumber numberWithInt:myIndex] 
                    waitUntilDone:YES];

当然,您必须编辑您的 chooseURL: 方法以接受 NSNumber 而不是 int。展开:

int myInt = [myIndex intValue];
于 2012-04-27T18:32:07.083 回答
2

从 int 创建一个 NSNumber

[NSNumber numberWithInt:myInt];

于 2012-04-27T18:29:40.500 回答
2

使用 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()可以在同一个线程中使用。

于 2012-04-27T18:35:53.940 回答
1

NSNumber 可以归类为对象,因此请使用 [NSNumber numberwithint:myindex]

于 2012-04-27T18:33:06.147 回答