응용 프로그램이 시작될 때마다 웹 서비스에서 검색되는 25000 개의 레코드가 있습니다. 초기화 단계에서이 모든 항목을 핵심 데이터에 저장하고 싶습니다. 이 작업에 소요되는 시간은 약 20 분입니다. 모든 항목을 핵심 데이터에 더 빠르게 저장할 수 있습니까? sqlite 도구를 사용하여 sqlite 데이터베이스에 저장 한 다음 핵심 데이터를 인스턴스화하는 것이 좋습니다.
편집하다:
핵심 데이터에 저장하는 데 20 분.
func storeDevices(_ dataStack: DATAStack,value: [JSON]) -> Bool
{
dataStack.performInNewBackgroundContext { backgroundContext in
let entityDevices = NSEntityDescription.entity(forEntityName: "Devices", in: backgroundContext)
for item in value
{
if !item["event_id"].stringValue.isEmpty
{
let id = item["id"].stringValue
let predicate = NSPredicate(format: "%K == %@", "id", id)
let typesFetchRequest = NSFetchRequest<Devices>(entityName: "Devices")
typesFetchRequest.predicate = predicate
do {
let fetchedTypesResults = try backgroundContext.fetch(typesFetchRequest) as! [Devices]
if (fetchedTypesResults.count > 0)
{
let typeUpdate = fetchedTypesResults[0]
switch item["is_Deleted"].stringValue
{
case "true":
typeUpdate.setValue(true, forKey: "deletedStatus")
case "false":
typeUpdate.setValue(false, forKey: "deletedStatus")
default:
typeUpdate.setValue(false, forKey: "deletedStatus")
}
if let intVersion = Int(item["last_modified"].stringValue) {
typeUpdate.setValue(intVersion, forKey: "lastModified")
} else {
typeUpdate.setValue(NSNumber(value: 0 as Int32), forKey: "lastModified")
}
typeUpdate.setValue(NSNumber(value: 0 as Int32), forKey: "syncStatus")
typeUpdate.setValue(item["deviceUUID"].stringValue, forKey: "deviceUUID")
typeUpdate.setValue(item["deviceLocation"].stringValue, forKey: "deviceLocation")
let event_id = item["event_id"].stringValue
if !event_id.isEmpty
{
let predicate = NSPredicate(format: "%K == %@", "id", event_id)
let typesFetchRequest = NSFetchRequest<Events>(entityName: "Events")
typesFetchRequest.predicate = predicate
do {
let fetchedTypesResults = try backgroundContext.fetch(typesFetchRequest) as! [Events]
if (fetchedTypesResults.count > 0)
{
typeUpdate.setValue(fetchedTypesResults[0], forKey: "event")
}
else
{
continue
}
} catch {
let saveError = error as NSError
print("Failed to fetch events in Devices: \(saveError)")
}
}
continue
}
} catch {
fatalError("Failed to fetch devices: \(error)")
}
let deviceNewElement = Devices(entity: entityDevices!, insertInto: backgroundContext)
deviceNewElement.id = id
switch item["is_Deleted"].stringValue
{
case "true":
deviceNewElement.deletedStatus = true
case "false":
deviceNewElement.deletedStatus = false
default:
deviceNewElement.deletedStatus = false
}
if let intVersion = Int(item["last_modified"].stringValue) {
deviceNewElement.lastModified = intVersion as NSNumber?
} else {
deviceNewElement.lastModified = NSNumber(value: 0 as Int32)
}
deviceNewElement.deviceUUID = item["deviceUUID"].stringValue
deviceNewElement.deviceLocation = item["deviceLocation"].stringValue
let event_id = item["event_id"].stringValue
if !event_id.isEmpty
{
let predicate = NSPredicate(format: "%K == %@", "id", event_id)
let typesFetchRequest = NSFetchRequest<Events>(entityName: "Events")
typesFetchRequest.predicate = predicate
do {
let fetchedTypesResults = try backgroundContext.fetch(typesFetchRequest) as! [Events]
if (fetchedTypesResults.count > 0)
{
deviceNewElement.event = fetchedTypesResults[0]
}
else
{
continue
}
} catch {
let saveError = error as NSError
print("Failed to fetch events in Devices: \(saveError)")
}
}
deviceNewElement.syncStatus = NSNumber(value: 0 as Int32)
}
}
try! backgroundContext.save()
}
return true
}
CoreData 사용 방법을 최적화해야합니다.
데이터를 처리하고 어떤 ManagedObjects를 터치해야하는지 파악하고 루프 외부에서 대량으로 미리 가져옵니다. 프리 페칭이 필요할 수도있는 관계를주의하십시오. 결함이 지속적으로 발생하는 것을 원하지 않습니다.
이제 모든 변경을 수행하십시오. 마지막에 한 번 저장하십시오.
메모리 부족으로 인해 데이터를 수천 개의 청크로 분할하고 위와 같이 처리하십시오. @autoreleasepool을 사용하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다