2012-08-16 16 views
14

Muszę wstrzymać bieg NSOperation, który został wstawiony do NSOperationQueue. Obecnie anuluję wszystkie operacje i zrestartuję je. Ale doprowadziłoby to do pewnego rodzaju dublowania pod względem wykonanego procesu. Próbowałem z flagą setSuspended z NSOperationQueue. Ale to nie wstrzymuje operacji. Czy jest jakieś wyjście?Jak mogę wstrzymać NSOperation w NSOperationQueue?

Odpowiedz

10

zobaczyć: Link

I tu od apple docs:

zawieszania i wznawiania Kolejki Jeśli chcesz wydać tymczasowe wstrzymanie realizacji operacji, można zawiesić odpowiednią kolejkę operacji przy użyciu metody setSuspended:.

Wstrzymywanie kolejki nie powoduje już wstrzymania wykonywania operacji w trakcie wykonywania ich zadań. Po prostu uniemożliwia zaplanowanie wykonania nowych operacji. Możesz zawiesić kolejkę w odpowiedzi na żądanie użytkownika, aby wstrzymać wszelkie trwające prace, ponieważ oczekuje się, że użytkownik może w końcu chcieć wznowić tę pracę.

+0

Dzięki! Próbowałem zaimplementować jako z twojego linku. Dodałem nową zmienną o nazwie 'isPaused' wewnątrz NSOperation i kiedy potrzebuję wstrzymać operację, ustawię ją na YES. Wewnątrz NSOperation będę regularnie sprawdzać wartość "isPaused". Ilekroć znajdę to na "TAK", wyjdę z pętli. Ale mam tutaj poważny problem. Próbuję ustawić wartość "isPaused" z głównego wątku. Może to prowadzić do pewnych warunków wyścigowych. Czy istnieje sposób na pozbycie się warunków wyścigu? Czy istnieje sposób wywoływania metod (zatrzymywania i wznawiania) w tym samym wątku (zamiast w wątku głównym)? – Advaith

+1

@Advaith: Jeśli oba wątki zablokują muteks przed odczytaniem lub zapisaniem do "isPaused", nie będziesz musiał martwić się o wyścigi. –

3

Ja nie próbowałem, ale pewnie bym zacząć tutaj:

  • dodać isPaused flagę do NSOperation podklasy
  • wdrożyć metody Kopiuj/przenieś do danych danej operacji
  • jeśli wstrzymano, (obejrzyj tę zmianę w -main)
  • utwórz nową operację przenoszenia stanu z wstrzymanej operacji na nową operację
  • ustawić priorytet uporządkować kolejność operacji w kolejce, jeśli chcesz
  • dodać klona do kolejki
  • zwrot z -main jeśli w -main

pamiętać, że będzie to po prostu zawiesić go. jeśli naprawdę chcesz wstrzymać i wyraźnie wznowić, ręcznie wznowisz "nową operację", gdy chcesz wznowić.

teraz, jeśli obserwujesz lub masz specjalne uzupełnienia, będziesz miał kilka innych problemów. w przypadku prostych spraw wydaje się, że takie podejście wydaje się działać dobrze.

Powiązane problemy