Core data 按下ViewController并弹出会导致核心数据对象丢失值

Core data 按下ViewController并弹出会导致核心数据对象丢失值,core-data,ios5,Core Data,Ios5,我正在推一个视图控制滚轮,然后当我通过一个段控制器弹出它以返回原始视图时。有几个值会改变。一个是距离值,一个是浮点值,另一个是作为二进制数据存储的缩略图 有没有一种方法可以告诉核心数据在推送另一个视图控制器之前,基本上冻结此阵列?它当前是一个阵列?可能会将其复制到tmpArray,然后在ViewDidDisplay上复制回该tmpArray(如果存在)?听起来真的很烦人,但我需要让它工作 thx 编辑1 所以这里有一些关于出错的代码。因此,getAllLocationsWithFinished似

我正在推一个视图控制滚轮,然后当我通过一个段控制器弹出它以返回原始视图时。有几个值会改变。一个是距离值,一个是浮点值,另一个是作为二进制数据存储的缩略图

有没有一种方法可以告诉核心数据在推送另一个视图控制器之前,基本上冻结此阵列?它当前是一个阵列?可能会将其复制到tmpArray,然后在ViewDidDisplay上复制回该tmpArray(如果存在)?听起来真的很烦人,但我需要让它工作

thx

编辑1

所以这里有一些关于出错的代码。因此,getAllLocationsWithFinished似乎导致self.tmpLocations发生更改:

  //works
  NSLog(@"#1 locations right before call: %@",[self.locations objectAtIndex:2]);
  self.tmpLocations=[[NSArray alloc] initWithArray:[self.locations copy]];
  //works
  NSLog(@"#2 locations right before call: %@",[self.tmpLocations objectAtIndex:2]);

  [[ModelManager sharedModelManager] getAllLocationsWithFinished:^(NSArray* map_locations) 
  {
    // data is off
    NSLog(@"#3 locations right before call: %@",[self.tmpLocations objectAtIndex:2]);
铁姆邦

如果要在视图控制器中创建这些项,则可以通过保存它们来保证它们保持原样。也就是说,如果核心数据是你的罪魁祸首,我会非常惊讶。导航控制器是一种与核心数据正交的技术;它们相互独立

您是否绝对确定在推送视图控制器可见时不会出现内存警告?它们经常发生,尤其是当涉及到BLOB时,导航控制器。您的代码可能负责更改值

如果您使用GCD在-getAllLocationsWithFinished:中执行后台任务,那么您很可能没有从后台MOC捕获did save通知。必须捕捉到这一点,并在线程之间合并对象,以保持主线程的对象与背景同步


Andrew

您确定在主线程上调用了getAllLocationsWithFinished回调方法吗?另外,您的tmpLocations属性是如何声明的?坚强的在块运行之前和使用位置数组分配属性之后,请尝试以下操作:uu block NSArray*testArray=self.tmpLocations;然后NSLog block.tmpLocations内的*testArray为declard strong。getAllLocationsWithFinished将在后台线程上运行。当我记录testArray时,距离和defaultImageData都为零。对于后台任务,不使用GCD正确设置其他值。我们甚至没有在本地保存对象。我同意我不认为这是一个核心数据问题。出于某种原因,此映射控制器正在导致问题-这些是独立的类,因此它们不应该能够操作另一个类中的值。这就是我怀疑核心数据的原因之一,因为它是一个常见的部分。我打开了SQL调试,但它没有提供任何信息。timpone,您的问题显然存在于-getAllLocationsWithFinished:。这就是您需要执行一些分而治之日志记录的地方。安德鲁斯,我同意这座街区正在发生变化——这就是迪莱姆纳;是否有任何方法可以将其包装在通知中,以查看谁正在将其更改为调试机制。抱歉-调试这些iOS类型的问题有点新。我想让我生气的是,我正在将它复制到一个新的tmpArray中,但它仍然会被更改。这在记忆中应该是完全分开的,对吗?我理解blocks的方式是变量self.tmpLocations应该进入范围,并且基本上保持这种方式。现在还不清楚为什么这个值会在那一点上发生变化。t注意,复制数组不是深度复制。因此,两个数组中的对象是相同的。NSLog是你的朋友。打印出来并阅读结果。将块一分为二,找出变化发生的位置。调试iOS与在其他计算机上没有什么不同。安得烈