gpt4 book ai didi

ios - 从互联网下载数据后,在将数据插入核心数据时 GUI 卡住

转载 作者:行者123 更新时间:2023-11-28 21:38:18 26 4
gpt4 key购买 nike

当我从 Internet 下载大数据(使用 url 分页)并将其保存在核心数据中时,我遇到了一个问题。在保存数据期间,我的应用程序 GUI 被卡住。保存数据后,我的应用程序正常运行。我需要您的帮助,了解如何解决应用卡住问题。

我正在使用异步的 NSURLConnection 委托(delegate)方法下载数据。在 connectionDidFinishLoading 方法中,我将数据插入到核心数据中。这是 connectionDidFinishLoading 方法中的代码。

[客户 insertCustomerWithList:data];[self.delegate connectPermissionServiceSuccessful:method];

在此处,insertCustomerWithList 方法应用程序被卡住。如果我使用 dispatch_async GCD 方法,则应用程序会因出现此错误而开始崩溃。

ERROR*** Collection <NSCFSet: 0x7c2282e0> was mutated while being enumerated.

这是 GCD 的代码。

dispatch_queue_t coreDataThread = dispatch_queue_create("com.YourApp.YourThreadName", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(coreDataThread, ^{
[Customer insertCustomerWithList:data];
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate connectPermissionServiceSuccessful:kMethod];
});
});

这是在核心数据中插入数据的 insertCustomerWithList 方法。

+ (BOOL) insertCustomerWithList:(NSArray*)customerList

`{NSError *error = nil;
BOOL success = YES;
Customer *obj = nil;
NSManagedObjectContext *managedObjectContext = [NSManagedObjectContext managedObjectContext];`

if (managedObjectContext == nil)
{
success = NO;
}
@try
{
for (NSInteger index = 0; index < customerList.count ; index ++)
{
NSDictionary* customerInfo = customerList[index];
obj = [self getCustomerByID:customerInfo[@"_id"]];
if (obj == nil)
{
obj = [NSEntityDescription insertNewObjectForEntityForName:kEntityName
inManagedObjectContext:managedObjectContext];
[obj updateCustomer:customerInfo];
}
else
{
[obj updateCustomer:customerInfo];
}
}
}
@catch (NSException *exception)
{
NSLog(@"__ERROR__%@__", exception.reason);
}
[managedObjectContext save:&error];

return success;
`}`

请帮助我解决这个问题。

最佳答案

您应该使用 NSManagedObjectContextperformBlock API 而不是创建您自己的线程。

以下设置不会阻止您的 UI:

Root context (background) - save to persistent store
Main context (foreground) - child of Root, used on UI
Worker context (background) - child of Main, do heavy loading

您的网络调用的结果 block 应该创建一个工作上下文并插入新数据。然后 save() 方法会将更改“推送”到主上下文,因此如果您的 UI 需要显示新数据,这已经是可能的。主上下文的 save() 将更改推送到根上下文,只有当您在根上下文上调用 save() 时,更改才会写入数据库。

使用 block API 进行后台操作,你会没事的。

关于ios - 从互联网下载数据后,在将数据插入核心数据时 GUI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33086698/

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