gpt4 book ai didi

ios - MagicalRecord:如何在后台保存导入的数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:08 26 4
gpt4 key购买 nike

我正在尝试将数据导入 Core Data 并使用 MagicalRecord 将其保存在后台线程中。

我基本上是在尝试这样做:

__block User *user = nil;
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext)
{
user = [User MR_findFirstOrCreateByAttribute:@"userId" withValue:userId inContext:localContext];
[user MR_importValuesForKeysWithObject:responseObject];
}];

[User setCurrentUser:user];

当我在街区内时,用户是正确的。 block 完成后,user 是一个 NSManagedObject 对象,但没有设置任何属性。

另一方面,这有效:

OEUser *user = [OEUser MR_findFirstOrCreateByAttribute:@"userId" withValue:userId];                               
[user MR_importValuesForKeysWithObject:responseObject];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
[User setCurrentUser:user];

但是我想把它保存在后台。


这个我也试过了,没用。

User *user = [User MR_findFirstOrCreateByAttribute:@"userId" withValue:userId];
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext)
{
User *localUser = [user MR_inContext:localContext];
[user MR_importValuesForKeysWithObject:responseObject];
}];

[User setCurrentUser:user];

这里的问题似乎是 [user MR_inContext:localContext] 返回 nil

我是 Core Data 的新手,所以如果我遗漏了一些明显的东西,请多多包涵。

最佳答案

当您使用 *Wait 方法时,您不会获得任何异步性,并且在导入期间您仍然会阻塞主线程。您确实应该使用 block 方法,但这是为了确保在正确的线程(创建 NSManagedObjectContext 的线程)上执行任何核心数据操作。

当您使用 saveWithBlockAndWait: 时,MagicalRecord 会在后台线程上创建一个新的上下文来执行它的工作。然后,这个新创建的上下文将交给您的 block ,并且仅在 block 的范围内存在。您不能在上下文之间传递 NSManagedObject,因此您不应尝试从 block 外部捕获用户。

我可以想象第二个示例实际上只会在创建新 User 的情况下失败,因为您调用 MR_findFirstOrCreateByAttribute:withValue: 这将创建一个新的 NSManagedObject 在内存中,但它不会持久保存到存储中,因此在 saveWithBlockAndWait: 中没有要从存储中提取的 User

正确的做法是

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
User *localUser = [User MR_findFirstOrCreateByAttribute:@"userId"
withValue:userId
inContext:localContext];
[user MR_importValuesForKeysWithObject:responseObject];
}];

User *user = [User MR_findFirstByAttribute:@"userId" withValue:userId];

[User setCurrentUser:user];

如前所述,这会阻塞主线程,因此您可能需要考虑转而使用 saveWithBlock:completion:,这将在后台执行工作而不阻塞当前线程。

更好的是,我会考虑不持有一个实际的 User 对象,而是持有 userId,当人们开始访问 currentUser 来自各种线程

关于ios - MagicalRecord:如何在后台保存导入的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23768124/

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