2011-02-10 16 views
17

NSOperationQueue'nun addOperationWithBlock kullanıyorum. Bloğun içinden, işlemi iptal edip etmemem gerektiğini nasıl kontrol edebilirim? Veya herhangi bir NSOperation özellik/yöntemine mi erişirsiniz? Bir NSBlockOperation kullanmak için bunu yapmak için daha iyi bir yoladdOperationWithBlock ile oluşturulan işlem iptal nasıl?

[myOperationQueue addOperationWithBlock: ^{ 

    while (/* long running loop */) 
    { 
     // how to determine here if I need to cancel? 
     // for that matter, access any NSOperation properties/methods? 

    } 

}]; 

mi?

cevap

49

Daha iyi bir çözüm, NSBlockOperation kullanmak ve bunu bir ham blok yerine sıraya eklemek olabilir. Sen böyle bir şey yapabileceğini:

yanı (size operasyon üzerinde biraz daha fazla kontrole sahip ... ve birkaç tane daha NSOperation incelikler iken Bu bloklar kullanmanızı sağlar
__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
    while(![operation isCancelled]){ 
    //Some long operation 
    } 
}]; 

[[self queue] addOperation:operation]; 

örneğin, tamamlama blokları ekleme yeteneği gibi).

+0

neredeyse istediğim şey bu. ama sadece bu belirli blokta çalışır. Benim durumumda, bloğum başka bir bloğu başka bir bloğa çağırır ve bu noktada artık 'operasyona' erişimim olduğunu düşünmüyorum. Sanırım çalışmamın tek yolu NSOperation'ı altüst etmem. – roocell

+0

Durumumu bloklarımın içinden geçirerek davamı çözebiliyordum. teşekkür ederim - bu yaklaşımı beğeniyorum çünkü NSOperation alt sınıfını önler. – roocell

+0

Bu çözüm harika görünüyor. Sahip olduğum tek küçük soru 'operasyon' değişkeninin __block ile etiketlenmesi gerekiyor mu? Bunu düşünmüyorum çünkü değişkenin değerinin bloğun içinde değiştirilmesi gerekmiyor. – Jake

2

Bir blokta ise işlemi iptal etmeniz gerekip gerekmediğini kontrol edemezsiniz. Bir blokta ise ve iptal edilmesi gerekiyorsa iptal edilir. NSOperation özelliklerine erişmek mümkün değildir, çünkü blok tek başına bir NSOperation örneği değildir.

örnek kod:

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSOperationQueue *q = [[NSOperationQueue alloc] init]; 
    [q addOperationWithBlock:^{ 
     [NSThread sleepForTimeInterval:10]; 
     NSLog(@"Block 1"); 
    }]; 
    [q addOperationWithBlock:^{ 
     [NSThread sleepForTimeInterval:3]; 
     NSLog(@"Block 2"); 
    }]; 
    [q cancelAllOperations]; 
    [NSThread sleepForTimeInterval:15]; 

    [pool drain]; 
    return 0; 
} 

Eğer beklediğiniz gibi cancelAllOperations sonra blokları ateş diyoruz kaldırırsanız.

İşlemin iptal durumu üzerinde daha iyi bir kontrole sahip olmanız ve NSOperationQueue ile etkileşimde bulunmanız gerekirse, bir NSBlockOperation yerine bir NSOperation kullanarak daha iyi durumda olacağınızı öneririm. Bunu başarmak için NSOperation alt sınıfını kullanabilirsiniz.

İlgili konular