У меня есть подкласс UITextField, MyTextField.Он является собственным делегатом, но имеет переменную myDelegate (установленную вызывающей стороной), поэтому я могу передать эти два сообщения делегату обратно вызывающей стороне:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
if ( [myDelegate respondsToSelector:@selector(textFieldDidBeginEditing:)] ) {
int isMainThread = [NSThread isMainThread];
NSLog(@"isMainThread %d",isMainThread); // isMainThread 1
// case 1: this does not work (myDelegate never executes textFieldDidBeginEditing:)
[myDelegate performSelector:@selector(textFieldDidBeginEditing:) withObject:textField afterDelay:0];
// case 2: but this works: Why?
[myDelegate performSelectorOnMainThread:@selector(textFieldDidBeginEditing:) withObject:textField waitUntilDone:NO];
}
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
if ( [myDelegate respondsToSelector:@selector(textFieldDidEndEditing:)] ) {
// case 3: this always works
[myDelegate performSelector:@selector(textFieldDidEndEditing:) withObject:textField afterDelay:0];
}
}
Почему я должен использовать executeSelectorOnMainThread: в случае # 1 (но не в случае № 3) несмотря на то, что код всегда находится в основном потоке?
(я думаю, что есть cancelPreviousPerformRequestsWithTarget: где-то, но не мной.)
Редактировать 1: Я должен использовать executeSelectorOnMainThread: и в случае № 3.
Редактировать 2: И почему бы просто не сделать
[myDelegate textFieldDidBeginEditing:textField];
вместо executeSelector: