gpt4 book ai didi

ios - 如何使用 CoreData 插入批量数据?

转载 作者:行者123 更新时间:2023-11-28 21:35:02 41 4
gpt4 key购买 nike

我的情况是每秒有200多个对象通过回调函数一个一个地来到我身边,显然我不能在这个回调函数中每次都保存一个实体,那会导致UI挂起,所以我的问题是如何用核心数据插入批量数据?

-------------------------------------------- --------------

编辑:

谢谢大家,我这样重新编辑了我的代码,但有一些问题, 如果我经常从回调函数中收到“1”、“2”、“3”...,我的 tableview 经常显示“1”、“3”、“2”...,它们的顺序是错误的。如果有任何问题,请告诉我。

在 AppDelegate.m 文件中:

    - (NSManagedObjectContext *)mainManagedObjectContext {     
if (_ mainManagedObjectContext != nil) {
return _managedObjectContext;
}

_mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_mainManagedObjectContext.parentContext = [self rootManagedObjectContext];
return _mainManagedObjectContext;
}

- (NSManagedObjectContext*)rootManagedObjectContext {

if (_rootManagedObjectContext != nil) {
return _rootManagedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}


_rootManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_rootManagedObjectContext setPersistentStoreCoordinator:coordinator];
return _rootManagedObjectContext;
}

在执行此操作的回调函数中,我尝试替换 _mainManagedObjectContext使用_rootContext_workContextint 回调函数,但数据从不显示在tableview 上;

- (void)saveChatMessage:(ChatMessage*)msg userInfo:(UserInfo*)user chatType:(ChatType)chatType receiverID:(long long)receiverID receiverName:(NSString*)receiverName
{

ChatObject *chatObject = [NSEntityDescription
insertNewObjectForEntityForName:@"ChatObject"
inManagedObjectContext: _mainManagedObjectContext];

chatObject.receiveTime = [NSNumber numberWithLongLong:[NSDate date].timeIntervalSince1970];
chatObject.text = msg.text;
chatObject.richText = msg.richText;
chatObject.senderID = [NSNumber numberWithLongLong:user.userID];
chatObject.senderName = user.userName;
chatObject.chatType = [NSNumber numberWithInteger:chatType];
chatObject.isFromHost = [NSNumber numberWithBool:user.isOrganizer];
chatObject.receiverID = [NSNumber numberWithLongLong:receiverID];
chatObject.receiverName = receiverName;


NSError *error;
if (![_workerContext save:&error]) {

}

if (![_rootContext save:&error]) {

}

}

- (NSFetchedResultsController *)fetchedResultsController {

if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"ChatObject" inManagedObjectContext:_mainManagedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"receiveTime" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];


NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:_mainManagedObjectContext sectionNameKeyPath:nil
cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

return _fetchedResultsController;

}

最佳答案

您必须使用背景上下文。我推荐这种设置:

RootContext (background) for saving --> is parent of
MainContext (main thread) for UI --> is parent of
WorkerContext (background) for insert, update, delete operations

根上下文和主上下文应在应用启动时设置。您可以在网络回调中创建一个工作上下文(当您有可用的新数据时),然后将上下文与 block API 一起使用:

workerContext.performBlock() {
// update data here
}

当您在 worker context 上调用 save() 时,UI context 会获取更改并可以正常更新自身(例如通过 NSFetchedResultsControllerDelegate)。确保您还对根上下文调用 save 以将数据保存到持久性存储。

这是一个好的方法的基本轮廓。如果您不熟悉所提到的某些技术,您可以在这个平台上找到对其中许多技术的详细解释。

关于ios - 如何使用 CoreData 插入批量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34224012/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com