2012-04-01 12 views
5

Temel aktivitelerle openWithCompletionHandler: (UIManagedDocument) senkronizasyonunda temel bir problemim var.iOS5.1: görevleri senkronize etme (tamamlanma süresini bekle)

Durum: Paylaşılan bir UIManagedDocument'ı yöneten bir singleton sınıfım var. Bu sınıf, belgesini belgesini normal durumda teslim etmesi gereken bir yöntem sağlar (yani, ne olursa olsun, onu oluşturur veya açar). Ancak openWithCompletionHandler: ana işini arka planda eşzamansız yaptığı için programım, belgenin gerçekten açık olana kadar fetchedResultsController ayarlanmasını beklemeliydi. Veritabanı hazır olmadığında "viewWillAppear" yöntemi (şu anda) yararlı bir çıktı üretmez. Beklemek benim için iyi olurdu, ama muhtemelen haberdar olmak daha iyi bir yol olurdu. Belki viewWillAppear bir runloop çağrılmadığı için setupFetchedResultsController için doğru nokta değil.

Bunu başarmak için standart bir model var mı?

Biraz daha fazla arka plan (çok önemli değil) CoreData UIManagedDocument içeren küçük bir iOS 5.1 uygulaması üzerinde çalışıyorum. iTunes-U'da geçen sonbaharın Stanford kursundan Ders 14 örneğini andırdım. UIManagedDocument öğesinin UITableViewController sınıfından uzaklaşmasını belgemi ele alan ayrı bir sınıfa yerleştirmeye çalışana kadar her şey gayet iyi çalışıyordu. Orijinal sürümünde, tamamlama işleyicisinde FetchedResultsController kuruldu.

cevap

3

Justin Driscoll 'in Core Data with a Single Shared UIManagedDocument numaralı telefonundaki mükemmel mesajını takip ediyorum.

UIManagedDocument singleton üzerinde tam bir yazma ve performWithDocument üzerinde bir örnek bulacaksınız. FetchedResultsController kurulum kodunuz gerçekten performWithDocument:^{} bloğuna gitmelidir.

Ayrıca, openWithCompletionHandler'ın iş parçacığı güvenli olmadığını unutmayın; belgeyi açarken performWithDocument öğesinin eşzamanlı başlatılması bir kilitlenmesine neden olur. Benim için çözüm önemsiz (ve oldukça uygulamaya özel) idi, bu yüzden aynı sorunla karşılaşırsanız, belge durumu değişikliklerini bildiren ve çoklu belge açıcıları için senkronizasyon noktanız olan UIDocumentStateChangedNotification'a bakmanızı öneririm.

eğer ilgilendi Bazı pasajı,

MYDocumentHandler init İlk

, kurulum sonunda ek bir bildirim: performWithDocument içinde Sonra

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(documentStateDidChange:) 
               name:UIDocumentStateChangedNotification 
               object:self.document]; 

, @synchronized (self.document) kritik açıkken üzerinde/Bir bölümün yalnızca bir iş parçacığının girdiğinden emin olmak için oluşturma/oluşturma bölümleri ve açma/oluşturma başarılı oluncaya kadar sonraki konuları engelleyin. blok/blokaj iplikleri için de

- (void)documentStateDidChange:(NSNotification *)notification 
{ 
    if (self.document.documentState == UIDocumentStateNormal) 
     @synchronized (self.document) { 
      ... unblock other document openers ... 
     } 
} 

, YMMV:

Son olarak aşağıdaki işlevi ekleyin. Uygulamaya özel gereksinimleri karşılamak için bazı dispatch_queues ile birlikte bir dispatch_semaphore_t kullandım. Davanız tamamlanmayı beklerken ya da diğer konuları bırakarak beklemek kadar basit olabilir.