2012-05-04 20 views
8

NSPrivateQueueConcurrencyType ve NSMainQueueConcurrencyType için NSManagedObjectContext, türlerini kullanırken, aynı bağlamda nested performBlock çağrıları yapmak güvenli midir?İç içe gerçekleştirme gerçekleştirmeBlock: on NSManagedObjectContext

[backgroundContext performBlock:^{ 
    NSFetchRequest *myRequest = ...; 
    __block NSArray *result= nil; 
    [backgroundContext performBlockAndWait:^{ 
     results = [backgroundContext executeFetchRequest:myRequest error:NULL]; 
    }]; 
}]; 

Aptalca görünebilir ama executeFetchRequest aramaları saklanması yardımcıları yöntemlerin bir sürü varolan kodların var. Arayanın performBlock'u kullanıp kullanmadığına dair varsayımlarda bulunmak istemiyorum. Örneğin :

-(void)updateObjects:(BOOL)synchronous 
{ 
    if (YES == synchronous) 
     [self fetchHelper]; 
    else 
    { 
     [backgroundContext performBlock:^{ 
      [self fetchHelper]; 
     }]; 
    } 
} 

-(NSArray*)fetchHelper 
{ 
    [self.backgroundContext performBlockAndWait:^{ 
     //Fetch the objects... 
     [self.backgroundContext executeFetchRequest: (...)]; 
    }]; 
} 

ben denedim ve çalışıyor. Ancak Çekirdek Veriler ve çoklu iş parçacıklarına çok dikkat etmenin (zor yoldan) öğrendim.

cevap

8

Evet, performBlockAndWait geçicidir. Doğrudan Apple'ın sürüm notlarına ...

Çekirdek Veri yeni seçeneklerle NSManagedObjectContext sınıf için eşzamanlılık modeli formalizes. Bir bağlamı oluşturduğunuzda, birlikte kullanılacak eşzamanlılık desenini belirtebilirsiniz: iş parçacığı hapsi, özel bir gönderme sırası veya ana gönderi kuyruğu. NSConfinementConcurrencyType seçeneği, 5.0'dan önceki iOS sürümlerinde bulunan davranışını ve varsayılanı sağlar. Bir sıra ilişkilendirmesiyle oluşturulan bir bağlama ileti gönderirken, kodunuz zaten bu sırada ( ana sıra türü için) veya performBlock kapsamı kapsamında değilse performBlock: veya performBlockAndWait: yöntemini kullanmanız gerekir. .. çağırma (özel sıra tipi için). Bu yöntemlerine geçirilen bloklar içinde, NSManagedObjectContext yöntemlerini özgürce kullanabilirsiniz. performBlockAndWait: yöntemi, API reentrancy özelliğini destekler. PerformBlock: yöntemi, bir otomatikleştirme havuzu içerir ve tamamlandıktan sonra processPendingChanges yöntemini çağırır.

+0

PerformBlock hakkında ne, bu da mı? – malhal

+0

Bu, bu oturumda ele alınmadı. PerformBlock'u, eşzamansız olarak çağırırsanız, istekleriniz sıraya girer. –

+0

sadece açık olmak gerekirse, OP'nin ikinci bit kodunda ne yapması iyi bir şey değil, ancak her iki yöntemde de "performBlock" varsa sorunlara neden olabilir? Buna bakmak için doğru yol bu mu? – hokkuk