Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 主线程看不到从后台线程所做的更改_Ios_Objective C_Multithreading_Realm - Fatal编程技术网

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好的。如果你能用这个更新你的答案,我会把它标记为我问题的答案。谢谢@Jaspercan
refresh
也为我修复了它–感谢@kishikawakatsumiCan您尝试
RLMRealm*defaultRealm=[RLMRealm defaultRealm];[defaultRealm刷新]completionBlock
中的
objectForPrimaryKey:
之前编码?kishikawakatsumi是的,这将解决问题。我猜在主线程看到这些变化时会出现一些计时问题?是的。在大多数情况下,更改会立即反映主线程。但有时并非如此。因为每次运行循环都会通知更改。当通知不符合运行循环时发生。它将在下一个运行循环中延迟。如果要避免调用
refresh
方法,应该使用通知块而不是调度主线程。@kishikawakatsumi好的。如果你能用这个更新你的答案,我会把它标记为我问题的答案。谢谢@Jaspercan
refresh
也为我修复了它–谢谢@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];