7

Mam do czynienia z problemem związanym z NSoperationQueue. W moim kodu w języku:Wywołanie - (void) cancelAllOperations na NSoperationQueue nie ustawia właściwości isCancelled of NSOperation, która jest obecna wewnątrz Queue

-(void) viewDidLoad 
{ 
    //Initialisation of queue and operation. 
    //adding operation to queue 
    [self.operationQueue addOperation:op]; 

} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self.operationQueue cancelAllOperations]; 
} 

So podczas realizacji mojego NSOperation główną funkcją kiedy jestem sprawdzania własności isCancelled zawsze zwraca NO. W rzeczywistości po wywołaniu cancellAllOperation na NSOperationQueue. np.

-(void)main 
{ 
    if(self.isCancelled) 
    { 
    // Never executing this block :-(
    } 

} 

Więcej szczegółów robię kilka połączeń sieciowych w moim NSOperation.And kiedy przeszedłem do innego widoku przez ówczesnego cancelAllOperation jest powołany. I kiedy odpowiedź sieciowa wróciła do mojej NSOperation, sprawdzam czy (Self.isCancelled) i teraz jestem w innym widoku (znaczy, toCancelled powinien ustawić TAK). ale ta kontrola zawsze kończy się niepowodzeniem.

+0

Czy jesteś pewien, że twoja operacja jeszcze się nie rozpoczęła, zanim zadzwonisz do cancelAllOperations? Będziesz musiał sprawdzić, czy ustawiona właściwość isCancelled jest ustawiona podczas wykonywania operacji. –

+0

Konsekwentnie sprawdzam właściwość isCancelled w mojej głównej metodzie operacji. I debugowania przez punkty przerwania i stwierdził, że po wywołaniu metody cancelAllOperation, gdy połączenie wraca do tego punktu kontrolnego, jeśli (self.isCancelled) jego zawsze zwracając NO. – kidsid49

+0

Czy zastępujesz metodę "cancel" w swojej NSOperation? Jeśli tak, możesz to opublikować? Jeśli nie, czy możesz przesłonić (wywołać super) i umieścić tam log lub punkt przerwania, aby sprawdzić, czy jest on wywoływany? –

Odpowiedz

1

Twoja operacja jest dodawana do kolejki zaraz po załadowaniu widoku w viewDidLoad, a kolejka będzie wtedy odpowiedzialna za rozpoczęcie operacji.

Po anulowaniu operacji, gdy widok zniknie (viewWillDisappear), operacja powinna najprawdopodobniej zakończyć się w tym momencie. Innymi słowy, twoja operacja jest anulowana po jej zakończeniu. Możesz sprawdzić właściwość isExecuting, aby dowiedzieć się, czy operacja działa aktywnie.

+0

Konsekwentnie sprawdzam właściwość isCancelled w mojej głównej metodzie operacji. I debugowania przez punkty przerwania i stwierdził, że po wywołaniu metody cancelAllOperation, gdy połączenie wraca do tego punktu kontrolnego, jeśli (self.isCancelled) jego zawsze zwracając NO. Połączenie przychodzi do tego punktu kontrolnego tylko wtedy, gdy wykonywana jest moja operacja. – kidsid49

1

Twoja operacja prawdopodobnie już nie działa, więc nie zostanie anulowana. (Po zakończeniu operacji kolejka operacji nie będzie już jej śledzić, więc wywołanie cancelAllOperations nic nie da.)

Jeśli odpowiedź sieciowa, na którą czekasz, wywołuje wywołanie zwrotne zamiast blokować połączenie do main, twoja operacja będzie już zakończona (gdy główny zwrot). Możesz to naprawić, wykonując operację "współbieżną" (zobacz dokumentację NSOperation, możesz wskazać, kiedy skończysz, a nie tylko automatycznie, gdy jest wykonywany główny zwrot) lub używając synchronicznych wywołań sieciowych (więc główna nie powróci do naprawdę skończyłeś).

+0

Dostaję twój punkt. Kiedy pojawia się moja odpowiedź, sprawdzam właściwość isCancelled, jeśli jest TAK, zwracam, w przeciwnym razie przeładowuję mój tabelaraprzed nową zawartością z odpowiedzi.Teraz to, co chcę zrobić, to jeśli nie jestem w tym widoku, a następnie, gdy odpowiedź wróciła, powinna sprawdzić właściwość isCancelled i nie powinna przeładować mojego tableView, jeśli nie jestem aktualnie w tym widoku. Czy możesz dać mi małą wskazówkę, jak tę sytuację można załatwić? – kidsid49

+0

Cóż, możesz skorzystać z synchronicznej metody sieciowania, jak sugerowałem, i po tym sprawdzać, czy nie jest już wywołana (ponieważ twoja operacja będzie nadal wykonywana). Alternatywnie, możesz użyć trzeciej biblioteki, takiej jak AFNetworking, która ma anulowane NSOperacje dla już zbudowanej aktywności sieciowej. –

Powiązane problemy