每当用户刷新页面时,我都会将大量 JSON 格式的数据(超过 2000 个实体)加载到核心数据中。我现在正在做的事情很好,但很耗时。我正在考虑使用某种分页,但这需要后端修改。希望有人可以帮助我优化流程。或者为我指出在 iOS 中存储大量数据的另一种解决方案。
这是花费最多时间的部分:
[moc performBlock:^{
for (NSDictionary *dictionary in dataObjectsArray) {
NSPredicate *predicate = [ObjectA predicateWithDictionary:dictionary];
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:ENTITY_NAME];
request.predicate = predicate;
NSError *error;
NSArray *fetchedObjects = [moc executeFetchRequest:request
error:&error];
ObjectA *objectATemp = (ObjectA *)[fetchedObjects lastObject];
if (!objectATemp) {
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:ENTITY_NAME
inManagedObjectContext:moc];
objectATemp = [[ObjectA alloc] initWithEntity:entityDescription
insertIntoManagedObjectContext:moc];
}
[ObjectA setObjectA:objectATemp
dictionary:dictionary];
// check if user already liked the ObjectA
ObjectB *likedObject = [ObjectB objectBWithId:objectATemp.id];
if (likedObject &&
!objectATemp.user_liked.boolValue) {
[likedObject.managedObjectContext deleteObject:likedObject];
}
}
NSError *error;
if ([moc hasChanges] &&
![moc save:&error]) {
NSLog(@"%@", error);
}
// saving Context
NSManagedObjectContext *managedObjectContext = [self newManagedObjectContext];
[managedObjectContext performBlock:^{
NSError *error;
if ([managedObjectContext hasChanges] &&
![managedObjectContext save:&error]) {
NSLog(@"%@", error);
}
if (completionHandler) {
completionHandler();
}
}];
}];
任何建议都很高兴。
最佳答案
使用 Core Data 存储大量数据不是问题; 2000 条记录甚至不是“很多”。每次用户点击按钮时都保存大量新数据会很慢。最好的解决方案是不需要每次都存储这些数据的所有。
但是您的代码中也存在一些明显的低效问题。
您在循环的每一次传递中都执行一个获取请求。假设您的 dataObjectsArray
包含 2000 个对象,即 2000 次提取。这很容易成为获取数据效率最低的方法。如果您可以进行一次获取,或者一次获取 100 或 200 个对象,而不是 2000 次遍历中每次只获取一个,那么您将获得重大改进。很难说最好的方法是什么,因为您没有描述您的谓词或您代码调用的其他方法,但这将是第一件事,它将获得最大的改进。如果您不能以较小的 block 获取数据,您可以至少以较大的 block 处理它。您可能需要更改 setObjectA:dictionary:
、objectBWithID:
等方法
此外,每次循环运行时,您的某些对象都是相同的。如果一个对象每次都相同,则创建一次,而不是(可能)2000 次。例如,entityDescription
。与数以千计的获取请求相比,这个问题要小得多,但它应该提供一些小的改进。
关于ios - 将大量数据存储到核心数据中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192505/