1

我想就地定义一个选择器。我该怎么做?

即我想做这样的事情:

 [self performSelector:@selector( function() {variable = 3;} ) withObject:self afterDelay:3]; 

其中variable是调用该函数的类的 int。

4

3 回答 3

2

考虑使用

int multiplier = 7; 
int (^myBlock)(int) = ^(int num) 
{
    return num * multiplier;
};

printf("%d", myBlock(3));
// prints "21"

Apple 为许多操作提供了基于块的 API,在这些操作中,@selector 回调是过去唯一的选择。请注意,块仅在 iOS 4.0 和更高版本中可用(尽管存在一些解决方案允许在旧 iOS 版本中使用基于块的代码)。

编辑:添加了在给定时间后调用块的更“真实”示例:

dispatch_time_t  delay = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_after(delay, queue, ^{variable = 3});

请注意,此示例使用了仅适用于 iOS 4.0 和更高版本的大型中央调度。

于 2012-04-06T10:44:08.887 回答
0

对于这种不平凡的任务与 GCD 相关的额外工作,您不妨创建一个单独的方法:

- (void) setVariable:(NSNumber *) value
{
    variable = [value intValue];
}

- (void) someOtherMethod
{
    [self performSelector:@selector(setVariable:) withObject:[NSNumber numberWithInt:3] afterDelay:3.0];
}

可以使用块或 GCD,但这为您提供了一个解决方案以及向后兼容性。唯一的缺点是它performSelector:withObject:afterDelay:没有最好的分辨率(例如它可能在 3.2 秒后执行,等等)

于 2012-04-06T11:25:45.743 回答
0

尝试这个 :

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    // Insert code here
}];
于 2012-04-06T11:44:04.807 回答