我们会在几个地方应用selector
1. Target/Action
在Interface Builder中建立了一个UIButton或是NSButton控件,然后将按钮连接到controller中IBAction的method上,这时候我们的Controller就是Button的target,而要求controller执行的method就叫做action。
action就是一个selector。
2. 检查method是否存在
检查某个对象是否有某个method,只要呼叫 respondsToSelector: 就可以了
if([myObject respondsToSelector:@selector(doSomething)]){
//...
}
performSelector:withObject:afterDelay: 的效果相当于产生 NSTimer 对象,当我们想要延迟呼叫某个method,或是要重复执行,都可以通过建立 NSTimer 对象达成,要使用timer,我们也必须使用selector语法。
我们先定义一个timer要做的事情:
4. 在某个Thread执行method
假如有一件事情会执行的太久,我们可以将这件事情丢到后台,也就是另外建立一条Thread执行:
[self performSeclorInBackground:@selector(doSomething:) withObject:nil];
注意,再后台执行时,这个method的内部需要建立自己的 Auto-Release Pool。
执行完毕后,通过 performSelectorOnMainThread:withObject:waitUntilDone:,通知主Thread我们已经把事情做完了。比如,我们要转换一个比较大的档案,就可以在后台实际转换,转换之后在告诉主Thread,在UI上跳出提示窗口,提示试用装已经转换完毕。
}
5. Array
我们也可以通过传递selector,要求Array里头每一个都执行一次指定的method
1. Target/Action
在Interface Builder中建立了一个UIButton或是NSButton控件,然后将按钮连接到controller中IBAction的method上,这时候我们的Controller就是Button的target,而要求controller执行的method就叫做action。
action就是一个selector。
2. 检查method是否存在
检查某个对象是否有某个method,只要呼叫 respondsToSelector: 就可以了
if([myObject respondsToSelector:@selector(doSomething)]){
//...
}
3. Timer
NSObject除了 performSelector: 这个method之外,同样以 performSelector 开头的还有好几组。
performSelector:withObject:afterDelay: 就可以让我们在一定的秒数之后才要求某个method执行
[self performSelector:@selector(doSomething) withObject:nil afterDelay:1.0];
如果时间还不到预定的要执行的时间,method还没有执行,我们也可以反悔,取消刚才预定的要执行的method
[NSObject cancelPreviousPerformRequestsWithTarget:self];
performSelector:withObject:afterDelay: 的效果相当于产生 NSTimer 对象,当我们想要延迟呼叫某个method,或是要重复执行,都可以通过建立 NSTimer 对象达成,要使用timer,我们也必须使用selector语法。
我们先定义一个timer要做的事情:
- (void)doSomething:(NSTimer *)timer
{
//todo...
}
然后通过 doSomething: 的 selector 建立 timer
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:someObject selector:@selector(doSomething:) userInfo:nil repeats:YES];
4. 在某个Thread执行method
假如有一件事情会执行的太久,我们可以将这件事情丢到后台,也就是另外建立一条Thread执行:
[self performSeclorInBackground:@selector(doSomething:) withObject:nil];
注意,再后台执行时,这个method的内部需要建立自己的 Auto-Release Pool。
执行完毕后,通过 performSelectorOnMainThread:withObject:waitUntilDone:,通知主Thread我们已经把事情做完了。比如,我们要转换一个比较大的档案,就可以在后台实际转换,转换之后在告诉主Thread,在UI上跳出提示窗口,提示试用装已经转换完毕。
- (void)doSomething
{
@autorealsepol{
//do something here
[self performSelectorOnMainThred:@selector(doAnotherThing) withObject:nil waitUntilDone:NO];
}
}
}
5. Array
我们也可以通过传递selector,要求Array里头每一个都执行一次指定的method
[anArray makeObjectsPerformSelector:@selector(doSomething)];