2011-05-24 20 views
12

İlk defa Objective-C bloklarını ve Operation Queues kullanıyorum. Ana UI bir döndürücü gösterirken bazı uzak verileri yüklüyorum. Tabloyu verilerini yeniden yüklemesi için bir tamamlama bloğu kullanıyorum. documentation mentions olarak, tamamlama bloğu ana iş parçacığı üzerinde çalışmaz, bu nedenle tablo verileri yeniden yükler, ancak tabloyu sürüklemek gibi ana iş parçacığı üzerinde bir şey yapana kadar görünümü yeniden çizmez.Bu, bir İşlem Kuyruğu tamamlama blokunun doğru kullanımı mı?

Şu anda kullanıyorum çözüm bir gönderme sırasıdır, bu UI bir tamamlama bloğundan yenilemek için "en iyi" yoldur? @ Gcamp önerisine Başına

// define our block that will execute when the task is finished 
    void (^jobFinished)(void) = ^{ 
     // We need the view to be reloaded by the main thread 
     dispatch_async(dispatch_get_main_queue(),^{ 
      [self.tableView reloadData]; 
     }); 
    }; 

    // create the async job 
    NSBlockOperation *job = [NSBlockOperation blockOperationWithBlock:getTasks]; 
    [job setCompletionBlock:jobFinished]; 

    // put it in the queue for execution 
    [_jobQueue addOperation:job]; 

Güncelleme , tamamlama bloğu artık GCD'nın yerine ana operasyon kuyruğu kullanır:

// define our block that will execute when the task is finished 
void (^jobFinished)(void) = ^{ 
    // We need the view to be reloaded by the main thread 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.tableView reloadData]; }]; 
}; 

cevap

17

aynen öyle o. Tamamlama bloğunuz için GCD yerine bir işlem kuyruğu kullanmak isterseniz, [NSOperationQueue mainQueue]'u da kullanabilirsiniz.

+0

Serin, mainQueue hakkında bilmiyordum. Biraz daha temiz ve daha tutarlı bu şekilde. Teşekkürler! –

+0

[NSOperationQueue mainQueue] ve dispatch_get_main_queue() kullanımı arasında gerçek bir fark var mı? –

+1

Sonuç olarak, hayır. Ama onu nasıl kullandığın farklı. 'NSOperationQueue' (açıkça) 'NSOperation' ve GCD (dispatch_get_main_queue) bloğunu kullanır. – gcamp