SORU
24 EKİM 2013, PERŞEMBE


NSOperation ve NSOperationQueue çalışan iş parçacığı ana iş parçacığı vs

İndir bir dizi yürütmek için var ve veritabanı uygulamamı yazma işlemleri. Aynı NSOperation NSOperationQueue kullanıyorum.

Bu uygulama senaryosu

  • Bir yerden posta kodları getir.
  • Her posta kodu için getir tüm evler.
  • Her ev sakini ayrıntıları getirmek için

Dediği gibi, her görev için NSOperation bir tanımlıyorum. İlk durumda (Task1), tüm kodları almak için sunucuya bir istek gönderiyorum. NSOperation içinde temsilci veri alacak. Bu veri veritabanına yazılır. Veritabanı işlemi farklı bir sınıf olarak tanımlanır. NSOperation sınıfından fonksiyon yazmak için bir arama veritabanı sınıfında tanımlanan yapıyorum.

Benim sorum veritabanı işlemi bir arka plan iş parçacığı ana iş parçacığı veya ortaya yazabilir mi? NSOperation içinde aramıştım olarak farklı bir iş parçacığı çalıştırmak için bekliyor (Değil) MainThread NSOperation olarak çalıştım. Birisi NSOperation NSOperationQueue ile uğraşırken bu senaryo açıklayabilir.

CEVAP
2 Kasım 2013, CUMARTESİ


Benim sorum veritabanı işlemi gerçekleştiğinde ana yazmak ister. bir iş parçacığı veya bir arka plan iş parçacığı?

Eğer sıfırdan: NSOperationQueue oluşturursanız

NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];

Bir arka plan iş parçacığı olacak:

İşlem sıraları genellikle kendi iş parçacığı çalıştırmak için kullanılan sağlamak işlemleri. OS X v10.6 ve daha sonra, işlem sıraları kullanın kütüphane (de Grand Central Dispatch olarak da bilinir) başlatmak için libdispatch yaptıkları işlemlerin yürütülmesi.Sonuç olarak, işlemler her zaman vardır ayrı bir iş parçacığı üzerinde yürütüldüne olursa olsun ister onlar eşzamanlı veya non-eşzamanlı operasyonlar olarak belirlenmiş

mainQueue kullanmadığınız sürece:

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];

Ayrıca bu kodu görebilirsiniz:

NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
[myQueue addOperationWithBlock:^{

   // Background work

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        // Main thread work (UI usually)
    }];
}];

Ve GCD sürümü:

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
             {
              // Background work            
             dispatch_async(dispatch_get_main_queue(), ^(void)
              {
                   // Main thread work (UI usually)                          
              });
});

NSOperationQueue yapmak istediğiniz şey ile daha hassas kontrol sağlar. İki işlem arasındaki bağımlılıklar (ve kaydetmek için veritabanı indirmek) oluşturabilirsiniz. Bir blok ve diğer arasında verileri aktarmak için, örneğin, bir NSData sunucu çok gelen olacak varsayabiliriz:

__block NSData *dataFromServer = nil;
NSBlockOperation *downloadOperation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakDownloadOperation = downloadOperation;

[weakDownloadOperation addExecutionBlock:^{
 // Download your stuff  
 // Finally put it on the right place: 
 dataFromServer = ....
 }];

NSBlockOperation *saveToDataBaseOperation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakSaveToDataBaseOperation = saveToDataBaseOperation;

 [weakSaveToDataBaseOperation addExecutionBlock:^{
 // Work with your NSData instance
 // Save your stuff
 }];

[saveToDataBaseOperation addDependency:downloadOperation];

[myQueue addOperation:saveToDataBaseOperation];
[myQueue addOperation:downloadOperation];

Düzenleme:İşlemleri için __weak başvuru kullanıyorum neden here bulunabilir. Ama kısaca döngüleri önlemek korumak için.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • Caramthros

    Caramthros

    10 AĞUSTOS 2007
  • guau . .

    guau . .

    25 Ocak 2008