执行获取对象的获取请求属性后为零

Posted

技术标签:

【中文标题】执行获取对象的获取请求属性后为零【英文标题】:After executing fetch request properties of fetched object are nil 【发布时间】:2013-11-05 15:30:05 【问题描述】:

我正在从某个实体获取一组托管对象。在 executeFetchRequest 返回 I NSLog 元素及其属性之后,一切都很好。在我返回新生成的数组并尝试在后台线程或其他方法中使用它后,数组内的托管对象的属性变为 nil。这是代码:

Utakmice -NSManagedObject 子类

    - (NSArray*)ucitajPodatke:(NSDate*)zaDatum drzavaId:(int)_drzavaId
    

            NSManagedObjectContext *con = [[NSManagedObjectContext alloc] init];
            [con setPersistentStoreCoordinator:persistentStoreCoordinator];
            [con setStalenessInterval:0];
            [con setUndoManager:nil];
            // create request and predicate
            // set return result type to NSManagedObjectResultType
            ...
            ...

        return fetchedObjects; -> This works cause I can log everything and all values R OK...
    

    -(void)SomeMethod
        NSArray *array  = [self ucitajPodatke:danas drzavaId:self.drzavaId];

        Utakmice *tekma = [array objectAtIndex:0];
        NSLog(@"%i", [tekma.uniqueId intValue]); -> everything is fine


        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.35 * NSEC_PER_SEC);
            dispatch_after(popTime, dispatch_get_main_queue(), ^(void)

                if (array != nil && [array count]>0)
                
                    Utakmice *tekma1 = [array objectAtIndex:0];
                    DLog(@"%@", tekma1.uniqueId);
                    DLog(@"%i", [tekma1.uniqueId intValue]); -> all properties have nil value
    ...
    ...

有什么建议吗??我真的不知道从这里去哪里......

还有一件事。在 ucitajPodatke 方法中,当我将返回结果类型设置为 NSDictionaryResultType -> 一切正常...(我需要托管对象,因为我需要关系)... 高级的谢谢

【问题讨论】:

【参考方案1】:

你需要做的第一件事,就是保持获取数组的强引用, 之后您就可以进行调度了。

这样称呼就好了

  [self performSelector:@selector(someMethod) withObject:nil afterDelay:0.35];

而不是调度。

此问题也可能与“数据错误”有关。 当您访问对象字段时,正在获取数据。 如果你想完全获取对象而不出错,你可以使用

NSFetchRequest *request = ...;// your fetch request here
[request setReturnsObjectsAsFaults:YES];
// Fetch here

【讨论】:

Hmmm 如果你查看我的代码,我在 fetch 后记录数据并且数据没问题,只有在将其分派到另一个线程后才会变得无用...... 通过将数据传递给另一个线程会导致此问题。尝试使用 performSelector:@selector(someMethod) withObject:nil afterDelay:0.35 并具有强大的属性来获取数组,以从 someMethod 访问数组 这不会打开一个新线程,该方法将在主线程上调用,这个问题应该会消失。 我需要另一个线程中的数据所以这不是解决方案,解决方案是通过托管 id 传递数据【参考方案2】:

好吧,我终于谷歌了: Core Data - sharing NSManagedObjects among multiple threads

看来U不能在线程之间传递托管对象,取而代之的是U应该传递托管对象id的

【讨论】:

是的,没错。或者,在您计划用于执行提取和处理结果的线程上创建一个新的 MOC。

以上是关于执行获取对象的获取请求属性后为零的主要内容,如果未能解决你的问题,请参考以下文章

如何创建获取请求以获取具有特定属性值的对象

带有谓词的核心数据获取请求。需要正确的 NSPredicate

django 获取request请求对象及response响应对象中的各种属性值

CoreData 获取请求在更改应用程序状态时返回具有 nil 属性的对象

如果我有一个加载用户对象的处理程序拦截器,将其添加到请求属性,我是不是强制转换为获取对象?

核心数据获取请求关系属性谓词