我目前的工作假设是-performSelector:withObject:afterDelay:
不使用线程,而是安排一个事件在稍后的日期在当前线程上触发。它是否正确?
进一步来说:
- (void) methodCalledByButtonClick {
for (id obj in array) {
[self doSomethingWithObj:obj];
}
}
static BOOL isBad = NO;
- (void) doSomethingWithObj:(id)obj {
if (isBad) {
return;
}
if ([obj isBad]) {
isBad = YES;
[self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1];
return;
}
//Do something with obj
}
- (void) resetIsBad {
isBad = NO;
}
是否保证-resetIsBad
之后才会被调用-methodCalledByButtonClick
返回,假设我们正在主线程上运行,即使-methodCalledByButtonClick
需要任意长的时间才能完成?
来自docs http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelector:withObject:afterDelay::
调用接收者的方法
这当前线程使用默认的
延迟后模式。
讨论更进一步:
该方法设置一个定时器来执行
当前的 aSelector 消息
线程的运行循环。计时器是
配置为在默认模式下运行
(NSDefaultRunLoopMode)。当计时器
触发,线程尝试出队
来自运行循环的消息和
执行选择器。如果出现则成功
运行循环正在运行并且在
默认模式;否则,定时器
等待直到运行循环进入
默认模式。
由此我们可以回答你的第二个问题。是的,有保证,即使延迟较短,因为当前线程正忙于执行performSelector
叫做。当线程返回到运行循环并使选择器出列时,您将从您的methodCalledByButtonClick
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)