Ios 主线程看不到从后台线程所做的更改
我在尝试查看主线程上的后台线程所做的更改时遇到问题Ios 主线程看不到从后台线程所做的更改,ios,objective-c,multithreading,realm,Ios,Objective C,Multithreading,Realm,我在尝试查看主线程上的后台线程所做的更改时遇到问题 -(void) someMethodRunByBackgroundThread { RLMRealm *defaultRealm = [RLMRealm defaultRealm]; MyObject *realmObject = [[MyObject alloc] init]; [defaultRealm beginWriteTransaction]; realmObject.myValue = @"Hello Wo
-(void) someMethodRunByBackgroundThread
{
RLMRealm *defaultRealm = [RLMRealm defaultRealm];
MyObject *realmObject = [[MyObject alloc] init];
[defaultRealm beginWriteTransaction];
realmObject.myValue = @"Hello World";
realmObject.primaryKey = 1;
[defaultRealm addObject:realmObject];
[defaultRealm commitWriteTransaction];
NSInteger primaryKey = realmObject.primaryKey;
dispatch_async(dispatch_get_main_queue, ^{
completionBlock(primaryKey);
});
}
-(void)completionBlock:(NSInteger)primaryKey
{
MyObject *realmObject = [[MyObject alloc] objectForPrimaryKey:[NSNumber numberWithInteger:primaryKey]];
}
调用completionBlock时,我无法找到领域对象。请记住,completionBlock是使用GCD发送到主线程的,根据文档,主线程应该自动看到其他线程完成的写提交
编辑:我已经在领域0.98.2和0.98.6上试过了。我目前也使用XCode 7.3
编辑2:添加到代码“[DefaultRealmAddObject:realmObject];”中,因为我不小心遗漏了它。谢谢Kishikawa指出这一点
谢谢 因为您没有将
realmObject
实例添加到defaultRealm
。因此,realmObject
没有持久化到defaultRealm
要将对象持久化到域中,需要调用-[RLMRealm addObject://code>方法并传递要持久化的对象
另见
因为您没有将realmObject
实例添加到defaultRealm
。因此,realmObject
没有持久化到defaultRealm
要将对象持久化到域中,需要调用-[RLMRealm addObject://code>方法并传递要持久化的对象
另见
Kishikawa Katsumi你好,谢谢你指出这一点,但这只是我的一个打字错误。我忘了在示例代码中添加该部分。现在将编辑它,谢谢!Kishikawa Katsumi你好,谢谢你指出这一点,但这只是我的一个打字错误。我忘了在示例代码中添加该部分。现在将编辑它,谢谢!你能试试RLMRealm*defaultRealm=[RLMRealm defaultRealm];[defaultRealm刷新]在completionBlock
中的objectForPrimaryKey:
之前编码?kishikawakatsumi是的,这将解决问题。我猜在主线程看到这些变化时会出现一些计时问题?是的。在大多数情况下,更改会立即反映主线程。但有时并非如此。因为每次运行循环都会通知更改。当通知不符合运行循环时发生。它将在下一个运行循环中延迟。如果要避免调用refresh
方法,应该使用通知块而不是调度主线程。@kishikawakatsumi好的。如果你能用这个更新你的答案,我会把它标记为我问题的答案。谢谢@Jaspercanrefresh
也为我修复了它–感谢@kishikawakatsumiCan您尝试RLMRealm*defaultRealm=[RLMRealm defaultRealm];[defaultRealm刷新]在completionBlock
中的objectForPrimaryKey:
之前编码?kishikawakatsumi是的,这将解决问题。我猜在主线程看到这些变化时会出现一些计时问题?是的。在大多数情况下,更改会立即反映主线程。但有时并非如此。因为每次运行循环都会通知更改。当通知不符合运行循环时发生。它将在下一个运行循环中延迟。如果要避免调用refresh
方法,应该使用通知块而不是调度主线程。@kishikawakatsumi好的。如果你能用这个更新你的答案,我会把它标记为我问题的答案。谢谢@Jaspercanrefresh
也为我修复了它–谢谢@kishikawakatsumi
[defaultRealm beginWriteTransaction];
realmObject.myValue = @"Hello World";
realmObject.primaryKey = 1;
[defaultRealm addObject:realmObject]; // You should add object to Ream to persist the object
[defaultRealm commitWriteTransaction];