私のアプリでは、データが同期されると、ローカルデバイスに同期させるべきサーバーから(与えられたタイムスタンプから)20kのエントリを得ることができます。すべてのエントリのために私はそれを(それがすでに存在する場合)を取得しようとすると私は新しいを作成しません。問題は、全体の操作が遅すぎるということです.iphone 5の20kは10+分です。しかし、もう1つの解決策は、指定されたタイムスタンプからすべてのエントリを削除し、すべての返されたエントリの新しいエントリを作成することで、すべての単一エントリに対してフェッチを実行する必要はありませんか?誰かがアドバイスを持っていればいいですね。ここでは、現在の状態のためのサンプルコードは、次のとおりです。ここでコアデータにエントリがあるかどうかを確認するより速い方法
var logEntryToUpdate:LogEntry!
if let savedEntry = CoreDataRequestHelper.getLogEntryByID(inputID: inputID, fetchAsync: true) {
logEntryToUpdate = savedEntry
} else {
logEntryToUpdate = LogEntry(entity: logEntryEntity!, insertInto: CoreDataStack.sharedInstance.saveManagedObjectContext)
}
logEntryToUpdate.populateWithSyncedData(data: row, startCol: 1)
は、実際の要求方法であって、私が試した
class func getLogEntryByID(inputID:Int64, fetchAsync:Bool) ->LogEntry? {
let logEntryRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "LogEntry")
logEntryRequest.predicate = NSPredicate(format: "inputId == %@", NSNumber(value: inputID as Int64))
logEntryRequest.fetchLimit = 1
do {
let mocToFetch = fetchAsync ? CoreDataStack.sharedInstance.saveManagedObjectContext : CoreDataStack.sharedInstance.managedObjectContext
if let fetchResults = try mocToFetch.fetch(logEntryRequest) as? [LogEntry] {
if (fetchResults.count > 0) {
return fetchResults[0]
}
return nil
}
} catch let error as NSError {
NSLog("Error fetching Log Entries by inputID from core data !!! \(error.localizedDescription)")
}
return nil
}
もう一つは、特定の要求のための数を確認することですが、再び遅すぎます。
class func doesLogEntryExist(inputID:Int64, fetchAsync:Bool) ->Bool {
let logEntryRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "LogEntry")
logEntryRequest.predicate = NSPredicate(format: "inputId == %@", NSNumber(value: inputID as Int64))
//logEntryRequest.resultType = .countResultType
logEntryRequest.fetchLimit = 1
do {
let mocToFetch = fetchAsync ? CoreDataStack.sharedInstance.saveManagedObjectContext : CoreDataStack.sharedInstance.managedObjectContext
let count = try mocToFetch.count(for: logEntryRequest)
if (count > 0) {
return true
}
return false
} catch let error as NSError {
NSLog("Error fetching Log Entries by inputID from core data !!! \(error.localizedDescription)")
}
return false
}
代わりの時に各潜在的な試合、1を取得し、なぜ「ドンすべての既存のID(またはコアデータのフィールドがある場合はタイムスタンプ以来のすべて)を配列またはセットにロードします。20,000の8バイトの識別子は160KBで、個々のフェッチよりもはるかに高速にメモリ内を検索できます大きなデータセット。 – Paulw11
@ Paulw11ありがとうございました!あなたの方法は私の輸入品を悲鳴にさせました!ありがとうございました。 – Adrian