同じ種類の多くのオブジェクトがある場合、コアデータは自然に物事を保存するために時間がかかるだろう。あなたがしていることに関係なく、それはしばらく時間がかかります。あなたができることは、あなたのUIをフリーズさせないためにバックグラウンドスレッドで場所を取るように保存を設定することです。
最も簡単な方法は、メインコンテキストの背景コンテキストを作成することです。基本的なコンテキストでは、データを親コンテキストに保存し、親コンテキストではデータをディスクに保存するという考えがあります。
メインコンテキストと親コンテキストの両方がメモリ内で実行されているので、子から親に保存操作を高速で:基本的にこのような。親にあなたのロケーションオブジェクトがあれば、それはバックグラウンドスレッドで保存されます。まだ長い時間がかかるかもしれませんが、UIをフリーズしてはいけません。
そして、あなたはこのようなあなたのコードでこれを設定することができます。
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
は、子コンテキストになります。あなたはそれが親のコンテキストに与えることがどれほど簡単かを見ることができます。
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)
}
}
}
(少し取られ、コードから編集「スウィフトとiOS用の学習コアデータ:ガイドハンズオン」ティム・Roadley著書)次に
は、あなたのデータを保存します。
iOSシミュレータまたはiPhoneで作業していますか?一部のアプリを終了してメモリを消去してみてください。 – brimstone
バックグラウンド保存に親コンテキストを使用してください。 –
また、アプリを終了することは事態を早めるために事実上何もしません。 –