gpt4 book ai didi

objective-c - 错误 : Object has been deleted or invalidated.( Realm )

转载 作者:太空狗 更新时间:2023-10-30 03:32:48 29 4
gpt4 key购买 nike

有时(很少但会发生)我收到错误 Object has been deleted or invalidated.,当我尝试使用属性或在 AFnetworking block 中修改我的模型对象时。谁能帮我找出我做错了什么?


错误 - 案例 1:

代码:

- (void)myFunction {
Model *model = [Model objectForPrimaryKey:1];

if (model) {
[self updateModel:model];
}
}

- (void)updateModel:(Model *)model {

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager PUT:@"http://www.example.com" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {

[[RLMRealm defaultRealm] beginWriteTransaction];
model.updated = YES; // Crash: Object has been deleted or invalidated.
[[RLMRealm defaultRealm] commitWriteTransaction];

} failure:nil];
}

错误 - 案例 2:

属性:

@property (strong, nonatomic) Model *model;

代码:

- (void)myFunction {
Model *model = [Model objectForPrimaryKey:1];

if (model) {
self.model = model;

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Would you like to edit the model?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
[alert show];
}
}

UIAlertView 委托(delegate):

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) {
[[RLMRealm defaultRealm] beginWriteTransaction];
self.model.updated = YES; // Crash: Object has been deleted or invalidated.
[[RLMRealm defaultRealm] commitWriteTransaction];
}
}

谢谢。

最佳答案

例如 1 网络请求在不同的操作队列上异步执行并回调到主线程,很可能你有一些代码,可以同时由用户操作触发并删除对象同时。您持有的模型对象引用将自动更新并反射(reflect)删除。因为无法修改已删除的对象,所以会出现错误。

示例 2 也涉及并发。您的代码首先检索模型对象,然后显示警报 View 。当显示 UIAlertView 时,主线程不会被阻塞。理论上同时,之前排队的网络操作可以完成,可以调度完成 block ,删除模型对象。用户确认修改。您的委托(delegate)实现被调用,但期望先前检索到的对象仍然存在。

避免崩溃的一种可能性是只存储主键而不是完整的模型对象引用,这样可以不断更新并反射(reflect)最近的更改。主键将保持不变,并且应该始终能够识别您的对象。然后您可以稍后使用主键直接在写入事务中检索对象。

请注意,在任何情况下,如果您的数据被同时修改,您都可以定义您的应用程序的行为方式。您可以尝试重新创建对象,方法是在周围保留更多数据,或者忽略该事件并让删除获胜,或者通过充分限制 UI 确保不会发生冲突修改。你必须想出一个解决冲突的策略。

关于objective-c - 错误 : Object has been deleted or invalidated.( Realm ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33179281/

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