SORU
26 Ocak 2011, ÇARŞAMBA


Apple bir NSManagedObjectContext oluşturulduğu iş parçacığı veya sıraya ait olduğunu söylediler ne anlama gelir?

Kasım ayında, Apple NSManagedObjectContext Class Reference Core Data Programming Guide belgeler de açıkça seri GCD NSManagedObjectContext bir erişim senkronizasyon için kabul edilebilir bir mekanizma gibi Kuyrukları ve NSOperationQueues Gönderme korusun güncellenmiş gibi görünüyor. Ama onların tavsiyelerini belirsiz ve muhtemelen çelişkili gibi görünüyor, ve bunu doğru anladım emin olmak istiyorum.

Daha önce akıl vermek gibi olmasın ama öyle gözüküyor ki bir NSManagedObjectContext sadece erişilebilir şerit o yarattı, ve bunu kullanarak bir seri sıra senkronizasyon yeterli değildi; ancak seri sıralar tek bir işlemi gerçekleştirmek için bir zaman, bu operasyonlar durum planlanan farklı konuları ve bir MOK yok gibi.

Ama şimdi, programlama kılavuzu, var:

İplikler, seri işlem sıraları kullanın, ya da eşzamanlılık için kuyruklar gönderebilirsiniz. Sıkıştırma uğruna, bu makalede,” bu hiçbir başvurmak boyunca. “parçacığı kullanır

Çok güzel konuları ve kuyrukları onların birleştirilmesini yararsızdır rağmen). Güvenli içerik başına (seri) tek bir kuyruk kullanabilirsiniz, işlem başına bir yerine/blok, değil mi? Apple bile Çekirdek Veri WWDC seansta bu görsel bir tasviri var.

Sıra için içerik oluşturun yerde ama...? NSManagedObjectContext belgelerinde, Apple durumu:

[İçerik] varsayar varsayılan iş parçacığı sahibi ya da—bu ayrılan sıra ınit yöntemi çağıran iş parçacığı tarafından belirlenir. Bu nedenle, bir iş parçacığı üzerinde bir içeriği başlatılamadı farklı bir konuya geçmek.

Şimdi NSManagedObjectContext sahibi kim olduğunu bilmek gerek bir fikrimiz yok. Bu sırada idam edilecek ilk işlem MOC oluşturmak ve diğer işlemler için bir referans kurtarmak anlamına gelir sanıyorum.

Bu doğru mu? Kararsız olmamın tek sebebi NSManagedObjectContext makale söylemeye devam ediyor:

Bunun yerine, kalıcı bir mağaza Koordinatörü başvuru pass ve iplik alma/sıra yeni bir içerik türetilen oluşturmak olmalıdır. Eğer NSOperation kullanırsanız, ana (seri a sıra için) veya start (eşzamanlı bir sıra için) içerik oluşturmanız gerekir.

Apple artık kendi yürütme zamanlama sıralar işlemler ile birleştirilerek gibi görünüyor. Bu kafamın içine ediyor, ve ben gerçekten sadece her işlem için yeni bir MOC oluşturmak ister ise merak ediyoruz. Neyi kaçırıyorum?

CEVAP
27 Ocak 2011, PERŞEMBE


Bu NSManagedObjectContext ve yönetilen nesneler ile ilgili tek bir aktör (iplik, seri sıra, maksimum eşzamanlılık ile NSOperationQueue = 1) tutturulmuş olmalıdır.

Bu desen iplik hapsi veya tecrit denir. Değil mi, harika bir ifade için (iş parçacığı || seri sırası || NSOperationQueue ile max eşzamanlılık = 1) Bu yüzden belgelere devam ediyor demek "biz sadece kullanın 'iş parçacığı' için geri kalan Temel Veriler doktor ne zaman biz demek bunların hiç birisini 3 yol almak bir seri akış denetimi"

Bir iş parçacığı üzerinde bir MOC oluşturun ve sonra başka bir kullanımı varsa, iki iş parçacığı için MOC nesne başvurusu açarak iplik hapsi ihlal etti. Basit. Yapma. Çekişi düşürme.

Açıkça konuları & GCD aksine,- ınit iplik NSOperation ama iş NSOperation çalışan ana çalışır yaratmaya çalıştığı garip bir sorun var çünkü NSOperation diyoruz. Eğer doğru aç mantıklı, ama kolay değildir. Eğer senin MOC oluşturmak -[NSOperation başlangıç], daha sonra NSOperation yardımsever-ana yöntem bile bitmeden iplik hapsi ihlal edecek ve ayvayı yedin.

Biz aktif / MOCs ve ipler kullanarak diğer şekillerde kaldırılan vazgeçirmek. Bbum bahseder ne yapmak teorik olarak mümkün olsa da, kimse bu hakkı var. Herkes takıldı, kilidi 1 yerde gerekli aramayı unuttum, "ınit çalışır nerede ?", veya clevered kendilerini başka. İle autorelease havuzları ve uygulama olay döngüsü ve geri alma yöneticisi ve kakao bağlamaları ve KVO, tıpkı bir çok yol için bir iş parçacığı üzerinde tutmak için bir başvuru için bir MOC sonra denedim geçirmek için başka bir yere. Hata ayıklama başlayana kadar gelişmiş Kakao geliştiriciler hayal bile çok daha zordur. Çok yararlı bir API değil.

Belgelere ve gitmek en akıllıca yol olarak iplik hapsi deseni netleştirmek vurgulamak için değiştirildi. Ekstra fantezi-kilit ve kilidini NSManagedObjectContext (a) imkansız kullanarak ve (b) de facto itiraz etmeye düşünmelisiniz. Kod artık eskisi kadar iyi çalışıyor çünkü tam anlamıyla kaldırılmış değildir. Ama kodunuzu kullanarak yanlış.

Bazı insanlar 1 iplik MOCs oluşturulan ve arama -kilidi olmadan diğerine geçti. Bu hiçbir zaman yasal oldu. MOC oluşturulan iş parçacığı her zaman MOC varsayılan sahibi olmuştur. Bu MOCs ana iş parçacığı üzerinde oluşturulan daha sık rastlanan bir sorun haline geldi. Ana iş parçacığı MOCs geri, bellek yönetimi ve diğer bazı nedenlerden dolayı uygulamanın ana olay döngüsü ile etkileşim. Üzerinde 10.6 ve 3, MOCs ana iş parçacığının sahibi olmanın daha agresif yararlanmak iOS.

Sıralar belirli bir iş parçacığı bağlı olmasa da, eğer bir sıra dahilinde bir MOC oluşturursanız doğru şey olacaktır. Yükümlülüğü kamu API izleyin.

Eğer sıra sıralanmış, sıra üzerinde çalışan blokları başarı ile MOK paylaşabilirsiniz.

Yani hiçbir koşulda birden fazla iş parçacığı (oyuncu vs.) NSManagedObjectContext* maruz bırakmayın. Bir belirsizlik var. Başka bir iş parçacığı MOC için didSave bildirim*- mergeChangesFromContextDidSaveNotification bu NSNotification iletebilir: yöntem.

  • Ben

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • backyardjay

    backyardjay

    8 ŞUBAT 2009
  • Tracy Hairston

    Tracy Hairst

    22 Mayıs 2009
  • Vortez

    Vortez

    27 Temmuz 2009