2011-10-25 17 views
12
benim uygulamasında aşağıdaki hatayı alıyorum

: bulabilirimÇekirdek Veri: deyim hala aktif

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. statement is still active with userInfo (null)

Her şey benim göbek verileri yönetilen nesne ile çoklu iş parçacığı sorunlarınız olabilir işaret gibi görünüyor bağlamda, ancak durumumun olduğu yerde uyguladığım herhangi bir yerde bulamıyorum. Arka plan iş parçacığında yönetilen bir nesne bağlamına erişiyorum ve yönetiyorum. Bağlam, yalnızca bir arka plan parçacığı üzerinde nesnelerin alınması ve işlenmesidir. NSManagedObjectContextObjectsDidSaveNotification aracılığıyla bu içeriğe yapılan tasarrufları tespit ettiğimde, değişiklikleri yalnızca ana iş parçama eriştiğim farklı bir bağlamda birleştiriyorum. Değişiklikleri birleştirmek için çağrı yaptığımda, hata atılır. Aynı veri kümelerinde bile bu durum çok nadir görülür.

'-com.apple.CoreData.ThreadingDebug 3' komutunu kullanarak 'çok iş parçacığı onaylamalarını etkinleştirmenin' mümkün olduğunu bir yere okudum, ancak bunu çalışmaya başlayamadım. Bunun mümkün olup olmadığını bilen var mı? Bunun, yanlış iş parçacığı veya bir şeyle ilgili bağlamda nerede oynadığımı bulmama yardımcı olacak bazı iddiaları açabileceğini umuyordum.

Neler olabileceğine veya bu tür sorunları nasıl izleyeceğimize dair başka ipuçları var mı?

+1

Cevabınız yardım mı etti? –

+0

Bunu [TN2124: Mac OS X Hata Ayıklama Sihirbazı] 'nda okuyabilirsiniz (https://developer.apple.com/library/ios/#technotes/tn2004/tn2124.html#SECCOREDATA). Anahtar bit, "Bu özellik çerçevenin hata ayıklama varyantını gerektirir." Bu türe sahip olsaydınız, 'DYLD_IMAGE_SUFFIX = _debug' ortam değişkenini ayarlayabilir ve framework için' CoreData' yerine 'CoreData_debug' yükleyebilirdi. Ne yazık ki, bu varyantlar sadece OS X 10.5.x için var gibi görünüyor. :( –

cevap

13

Benzer bir sorunla karşılaştım ve çözmenin bir yolunu buldum.

İş parçacığı adları (1 iş parçacığı = 1 içerik) temel alınarak farklı bağlamlar oluşturan bir mekanizma oluşturdum. Bu cevap yardımcı olacaktır

NSManagedObjectModel *myNewObject = [myBackgroundContext objectWithID:[myObject objectID]]; 

Hope i bir arka plan iplik yönetilen bir nesnenin tam sürümünü gerektiğinde

#include <pthread.h> 
... 

    mach_port_t threadID = pthread_mach_thread_np(pthread_self()); 
    NSString *threadName = [NSString stringWithFormat:@"%x", threadID]; 
    NSManagedObjectContext *context = [singleton.threadsContexts objectForKey:threadName]; 
    if (!context) { 
     NSLog(@"Creating managed context for thread named '%@'", threadName); 
     context = [[NSManagedObjectContext alloc] init]; 
     [context setPersistentStoreCoordinator:[singleton.managedObjectContext persistentStoreCoordinator]]; 

     //initialize dictionary in your singleton if it as not been yet 
     if(!singleton.threadsContexts) 
     { 
      singleton.threadsContexts = [NSMutableDictionary new]; 
     } 
     [singleton.threadsContexts setObject:context forKey:threadName]; 
    } 

    return result; 

sonra, ben bu konuya adanmış nesnenin bir kopyasını almak.

+1

[[NSThread currentThread] ad], iOS 7'de benim için "" değerini döndürür. [Bu yanıt] (http://stackoverflow.com/a/15523049/1571490) bana doğru bir String verdi. Ve tüm temel veri iş parçacığı sorunları sabit gibi görünüyor. Teşekkürler! – fifarunnerr

+0

İşleri harika! Ben bu kodu kullanıyorum beri çökme görmedim! Ayrıca iplik adını almak için fifa tekniği kullanmak zorunda kaldı. Başka bir ipucu, don ' NSMutableDictionary'ı singleton'unuzda başlatmayı unutun ... Farkına varıncaya kadar çevrelerde dolaştım. :: DUH :: – RyanG

+1

Oldukça eski bir cevap ve daha yeni projeler için inşa edilmiş olan Magical Record kullanıyorum. Çok iş parçacığı çekirdek verileri için destek.Kurulum çok iyi değil, ancak bu kitaplığı kullanmayı öğrendikten sonra çok zaman kazandırır. https://github.com/magicalpanda/MagicalRecord –

İlgili konular