2016-03-26 16 views
1

Cihazın gps rotasını izleyen bir iOS Uygulaması yaptım. Sorun şu ki, 5 dakikadan fazla izlediğimde, coredata'nın kaydedilmesi çok uzun sürüyor. Oturum denilen bir nesneyi kaydediyorum ve oturumda çok yer nesneleri var. konum nesnesi [[enlem, boylam]]Coredata çok yavaş; hızlıca

ve oturum nesnesinin [name: string, date: nsdate, ortalama hız: iki, yüksek hız: çift, sürülen kilometre: çift, konumlar: [[ Çift, çift]]]

bu yüzden çalışır ancak 5 dakika sonra.

+0

iOS simülatörü veya iPhone üzerinde çalışmak? Belleği temizlemek için bazı uygulamaları bırakmayı deneyin – brimstone

+0

Arka plan kaydetme için bir üst bağlam kullanın. –

+0

Ayrıca, uygulamaları bırakmak, işleri hızlandırmak için neredeyse hiçbir şey yapmaz. –

cevap

2

Kaydetmek 2 veya 3 dakika alırsa, aynı türden çok nesneye sahipseniz, Çekirdek Veriler işleri kurtarmak için uzun zaman alacak. Ne yaptığının önemi yok, biraz zaman alacak. Yapabilecekleriniz, kullanıcı arabiriminizi donduramayacak şekilde arka plan iş parçasındaki yerleri almaya kaydetmek için yapılandırmaktır.

En kolay yol, ana içeriğiniz için bir arka plan bağlamı oluşturmaktır. Buradaki fikir, ana içeriğinizin verilerini ana içeriğe kaydetmesi ve ana içeriğin diske veriyi devam ettirmekten sorumlu olmasıdır. Temelde böyle: ebeveyn hızlı üzere

Core Data Parent and Child Contexts

ana bağlam ve ebeveyn bağlam hem bellekte çalışması nedeniyle, çocuktan işlemi kaydedin. Ebeveyn konum nesnelerinize sahip olduğunda, arka plan iş parçacığına kaydedilir. Hala uzun bir zaman alabilir, ancak en azından kullanıcı arayüzünüzü dondurmamalıdır.

Ve böyle kodunuzda bu yapılandırabilirsiniz:

lazy var parentContext: NSManagedObjectContext = { 
    let moc = NSManagedObjectContext(concurrencyType:.PrivateQueueConcurrencyType) 
    moc.persistentStoreCoordinator = self.coordinator 
    return moc 
}() 

lazy var context: NSManagedObjectContext = { 
    let moc = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType) 
    // moc.persistentStoreCoordinator = self.coordinator 
    moc.parentContext = self.parentContext 
    return moc 
}() 

context çocuk bağlam olacaktır. Bir ebeveyn içeriği vermenin ne kadar kolay olduğunu görebilirsiniz.

class func save(moc:NSManagedObjectContext) { 

    moc.performBlockAndWait { 

     if moc.hasChanges { 

      do { 
       try moc.save() 
      } catch { 
       print("ERROR saving context \(moc.description) - \(error)") 
      } 
     } 

     if let parentContext = moc.parentContext { 
      save(parentContext) 
     } 
    } 
} 

(hafifçe alınmış ve Kod düzenlenebilir "Swift ile iOS için Öğrenme Çekirdek Data: A Guide Hands-on" Tim Roadley tarafından kitap) Ardından

, verilerinizi kaydedin.