传递int作为performSelectorOnMainThread的对象:

时间:2012-04-27 18:28:52

标签: objective-c cocoa-touch primitive

我需要调用:

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

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

4 个答案:

答案 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]