gpt4 book ai didi

ios - MagicalRecord saveInBackgroundWithBlock 不保存对象

转载 作者:行者123 更新时间:2023-11-28 22:13:26 24 4
gpt4 key购买 nike

这段代码对我来说效果很好,即使我重新运行应用程序,选项也会被保存。

 Player *selectedPlayer = [_players objectAtIndex:indexPath.row];

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {

Option *option = [Option MR_createInContext:localContext];

option.playerID = selectedPlayer.playerID;

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"playerID == %@", selectedPlayer.playerID];

Player *foundPlayer = [Player MR_findFirstWithPredicate:predicate inContext:localContext];

[foundPlayer addOptionObject:option];

[[STGameHelper sharedInstance].selectedGame addPlayersObject:selectedPlayer];

} completion:^{

if ([self.delegate respondsToSelector:@selector(didSelectedPlayer)])
{
[self.delegate didSelectedPlayer];
}

}];

但是如果尝试这个,数据库在重新运行应用程序后没有任何选项对象。

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {

Option *option = [Option MR_createInContext:localContext];

option.playerID = selectedPlayer.playerID;

Player *selectedPlayer = [_players objectAtIndex:indexPath.row];

[selectedPlayer addOptionObject:option];

[[STGameHelper sharedInstance].selectedGame addPlayersObject:selectedPlayer];

} completion:^{

if ([self.delegate respondsToSelector:@selector(didSelectedPlayer)])
{
[self.delegate didSelectedPlayer];
}

}];

我想我在不同的环境中工作,但我不明白它是如何工作的。因此,播放器条目存储在数据库中没有任何问题。为什么我不能选择已经保存的玩家记录并为此实体附加在某些上下文中创建的新记录。

我想当我重新运行应用程序并且数据库使用为 concert 属性(级联等)选择的内部规则删除选项实体时,某些上下文被扭曲了。我是对的还是我糊涂了?

最佳答案

我真的对 MagicalRecord 一无所知,但是......你这里似乎确实有跨上下文问题......

使用 CoreData 时,托管对象与其托管上下文紧密绑定(bind)。
您不能链接来自 2 个不同上下文的对象。

在您的第二个代码段中,您将一个对象插入 localContext(我认为这是一个临时的私有(private)队列上下文),您的选择,并将其链接到另一个上下文(可能是您的上下文)中的现有对象主要上下文)。

您需要通过以下方式将 selectedPlayer 导入您的本地上下文:

NSManagedObjectID* selectedPlayerID = [[_players objectAtIndex:indexPath.row] objectID];
NSError* error = nil;
Player* selectedPlayer = [localContext existingObjectWithID:selectedPlayerID error:&error];
//handle error if needed ...

这将防止您的跨上下文问题。

另一件事:

您的代码在后台执行,因此在执行时 [_players objectAtIndex:... 可能会改变。

您最好在声明 block 之前获取玩家对象 ID,并将该对象 ID 捕获在 block 中:

NSManagedObjectID* selectedPlayerID = [[_players objectAtIndex:indexPath.row] objectID;
[MagicalRecord saveInBackgroundWithBlock:^{/*your code here using selectedPlayerID*/}];

关于ios - MagicalRecord saveInBackgroundWithBlock 不保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22337360/

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