executeSelector: withObject: afterDelay: не работает, несмотря на начало в главном потоке - PullRequest
0 голосов
/ 18 января 2019

У меня есть подкласс 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:

...