Ios 执行提取请求后,提取对象的属性为零

Ios 执行提取请求后,提取对象的属性为零,ios,objective-c,core-data,Ios,Objective C,Core Data,我正在从某个实体获取一个托管对象数组。executeFetchRequest返回I NSLog元素及其属性后,一切正常。返回新生成的数组并尝试在后台线程或其他方法中使用它后,数组中托管对象的属性将变为零。代码如下: Utakmice-NSManagedObject子类 - (NSArray*)ucitajPodatke:(NSDate*)zaDatum drzavaId:(int)_drzavaId { NSManagedObjectContext *c

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

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->一切正常。。。(我需要托管对象,因为我需要关系)。。。
高级中的Thx

您需要做的第一件事是保持对已获取数组的强引用, 在那之后,你可以做你的调度

打个电话就好了

  [self performSelector:@selector(someMethod) withObject:nil afterDelay:0.35];
而不是派遣

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

NSFetchRequest *request = ...;// your fetch request here
[request setReturnsObjectsAsFaults:YES];
// Fetch here
好的,我终于谷歌了:


看起来,你不能在线程之间传递托管对象,相反,你应该传递托管对象id的

Hmmm。如果你看我的代码,我在获取数据后记录数据,数据正常,只有在将数据分配给另一个线程后才变得无用……将数据传递给另一个线程会导致此问题。尝试使用performSelector:@selector(someMethod)with object:nil afterDelay:0.35,并对获取的数组具有强属性,以从someMethod访问数组这不会打开新线程,该方法将在主线程上调用,并且该问题应消失。我需要另一个线程中的数据,因此这不是解决方案,解决方案是通过正确的托管IDY传递数据。或者,在计划用于执行获取和处理结果的线程上创建一个新的MOC。