我想就地定义一个选择器。我该怎么做?
即我想做这样的事情:
[self performSelector:@selector( function() {variable = 3;} ) withObject:self afterDelay:3];
其中variable
是调用该函数的类的 int。
我想就地定义一个选择器。我该怎么做?
即我想做这样的事情:
[self performSelector:@selector( function() {variable = 3;} ) withObject:self afterDelay:3];
其中variable
是调用该函数的类的 int。
考虑使用块:
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 和更高版本的大型中央调度。
对于这种不平凡的任务与 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 秒后执行,等等)
尝试这个 :
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// Insert code here
}];