2014-09-09 2 views
0

Правильно, если я отменил NSInvocationOperation внутри операции? пример:NSInvocationOperation Отменить использование

.h файл:

//defined in the interface 
NSInvocationOperation *op1; 
NSOperationQueue *loadQueue; 

.m файл:

-(id)init{ 
    op1 = [NSInvocationOperation new]; 
    loadQueue = [NSOperationQueue new]; 
} 

-(void)downloadData{ 
    op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadServerResponse:) object:newerRequest]; 
    [loadQueue addOperation:op1]; 
} 

Теперь у меня есть метод, чтобы загрузить данные с сервера. Я добавил условие, чтобы проверить, есть ли ошибка. Если это так, я отменяю эту операцию внутри метода и вызывая тот же метод при извлечении нового токена входа.

- (void)loadServerResponse{ 
    if(server_error){ 
     [op1 cancel]; 
     //fetch login token again 
     [self downloadData]; 
     return; 
    } 

Я делаю что-то неправильно?

ответ

1

Во-первых, ссылки на op1 (который я предполагаю, что это Ивар уровня класса), это плохо ™ на нескольких уровнях, первый из которых NSOperationQueue отправляет ваши операции на фоне потока, так op1 будет (в лучшем случае) копируются в контекст этого потока и больше не ссылаются на оригинальную операцию, которую вы пытались отменить.

Думаю, вам не нужно беспокоиться об отмене операции, учитывая логику, которую вы разделили. Кажется, вы хотите позвонить downloadData после отмены, и нет гарантии, что это произойдет, если вы сначала отмените операцию. Я бы просто удалил вызов, чтобы отменить операцию, и продолжить. Обычно вы только отменяете выполняемую операцию из внешнего источника (скажем, если вы получаете уведомление о том, что ваше приложение войдет в фоновое состояние).

+0

Если вы сказали правду, то как можно получить доступ к объекту NSInvocationOperation и отменить его (или любой другой метод)? – 2cupsOfTech

+0

Хороший вопрос - в этом конкретном примере OP пыталась отменить метод, который пыталась выполнить. Это означает, что он пытался ссылаться на объект через границы потоков, что обычно считается плохим. Если вы хотите отменить отмену, вы должны вызывать его из исходного потока, который помещает в действие операцию, подкласс NSOperation или управлять им внутренне. –

+0

это имеет смысл. Я делаю что-то подобное, но мой откат происходит извне (не от метода к исполнению), и я думаю, что это должно быть хорошо. Я обрабатываю isCancelled внутри метода для выполнения – 2cupsOfTech

Смежные вопросы