2011-10-17 14 views
7

Mam projekt, który pobiera obrazy w tle przy użyciu NSOperationQueue. Do tej pory działało na urządzeniach z IOS 4.3. Jeśli jednak zbuduję aplikację z podstawowym sdk 4.3 lub 5 i uruchomę aplikację na urządzeniu z IOS5, aplikacja się zawiesza. Po uruchomieniu aplikacji dodaje obiekty NSOperation do kolejki, aby pobrać obrazy. Jeśli pomiędzy naciśnięciu przycisku wstecz, mogę anulować NSOperation i wywala i wyświetla następujący ślad na konsoli:NSOperationQueue nie działa w IOS5

 
#0 0x004727b7 in ____NSOQSchedule_block_invoke_0() 
#1 0x026a5618 in _dispatch_call_block_and_release() 
#2 0x026a7a10 in _dispatch_worker_thread2() 
#3 0x974bb781 in _pthread_wqthread() 
#4 0x974bb5c6 in start_wqthread() 

i drukuje „ResourceLoadOperation isFinished = Tak bez rozpoczęty przez kolejce to jest w” Jeśli komentarz anuluj wywołanie metody, aplikacja nie zawiesza się. Czy są jakieś aktualizacje zmian NSOperation dla IOS5?

+0

Mam ten sam problem. Komentowanie zwolnienia obiektu NSOperation czyni trik, jak powiedziałeś, ale nie jestem do końca pewien, czy zarządzanie pamięcią jest w tym przypadku słuszne ... –

+0

Tak, po prostu komentowanie metody anulowania może nie mieć racji pod względem zarządzania pamięcią. Ale czy problem prędkości przetwarzania w ios 5 powoduje ten problem, ponieważ to samo działa na urządzeniach IOS 4.3? – CKT

Odpowiedz

12

miałem ten sam problem przy budowie przeciwko iOS 5. skończyło się tworząc flagę nazwie operationStarted który był NO domyślnie i włączać do YES gdy metoda start nazwano. Następnie w metodzie finish (gdzie generuję powiadomienia KVO) sprawdziłem wartość flagi przed uruchomieniem powiadomień.

Definicja flaga wygląda następująco:

@property (nonatomic, assign, getter=isOperationStarted) BOOL operationStarted; 

start metoda:

- (void)start { 
    [self setOperationStarted:YES]; 
    ... 
} 

Moja finish metoda, która jest wywoływana, gdy operacja jest zakończona lub anulowane:

- (void)finish {  
    if (![self isOperationStarted]) return; 

    [self willChangeValueForKey:@"isExecuting"]; 
    executing = NO; 
    [self didChangeValueForKey:@"isExecuting"]; 

    [self willChangeValueForKey:@"isFinished"]; 
    finished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 
} 

To rozwiązało problem dla mnie. Mam nadzieję, że pomaga komuś innemu.

+0

Jestem ciekawa, dlaczego potrzebujesz nawet operacji. Początkowa własność, kiedy już masz isexecuting w tym samym celu? –

Powiązane problemy