2012-06-02 33 views
1

我推一个视图控制器,然后当我通过一个段控制器弹出它回到原来的。一些值将会改变。一个是距离值(浮点数),另一个是存储为二进制数据的缩略图。推送ViewController和弹出会导致核心数据对象丢失值

有没有办法告诉核心数据基本上冻结这个数组(它当前是一个数组),然后它推动另一个视图控制器?也许把它复制到一个tmpArray,然后将其拷贝回viewDidAppear上的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]); 
+0

您确定'getAllLocationsWithFinished'回调方法在主线程上被调用吗?你的'tmpLocations'属性是如何声明的?强大?在块运行之前以及在为属性指定位置数组后,请尝试以下操作:'__block NSArray * testArray = self.tmpLocations;'然后NSLog块中的'* testArray'。 – Rog

+0

tmpLocations强度很强。在后台线程上getAllLocationsWithFinished将运行。当我NSLog的testArray距离和defaultImageData都是零。其他值设置正确 – timpone

回答

0

timpone,

如果要创建的视图控制器这些项目,那么你能保证他们仍然因为他们通过保存他们。也就是说,如果Core Data是你的罪魁祸首,我会非常惊讶。导航控制器是Core Data的一项正交技术;他们彼此独立。

您是否确定在推送的视图控制器可见时没有发生内存警告?它们经常发生,特别是当涉及BLOB时,导航控制器。您的代码可能会对变化的值负责。

如果您使用GCD在-getAllLocationsWithFinished:中执行背景任务,那么很可能不会捕获背景MOC中的保存通知。这必须被捕获并且线程之间的对象合并以使主线程的对象与背景保持同步。

Andrew

+0

不使用GCD进行后台任务。我们甚至不在本地保存对象。我同意我不认为这是一个核心数据问题。出于某种原因,这个Map Controller引发了一些问题 - 这些是单独的类,所以它们不应该能够在另一个中操纵值。这是我为什么怀疑Core Data的原因之一,因为它是一个常见的部分。我打开了SQL调试,但没有提供任何信息。 – timpone

+0

timpone,你的问题显然在'-getAllLocationsWithFinished:'内。那就是你需要执行一些分而治之的日志记录的地方。安德鲁 – adonoho

+0

所以,我同意它在这个块内变化 - 这是困境;有没有什么办法可以将它封装在通知中,以查看谁正在改变它(作为调试机制)。抱歉 - 有点新来调试这些iOS类型的问题。 – timpone