NSDistantObject枚举

时间:2011-03-17 00:22:21

标签: cocoa core-data

我正在为客户端 - 服务器应用程序进行通信,并且有一些奇怪的问题。 这是我拾取物品的代码。

- (byref NSArray*)objectsOfName:(bycopy NSString*)name 
                  withPredicate:(bycopy NSPredicate*)predicate;
{
    NSManagedObjectContext *context = [self managedObjectContext];
    NSError *error = nil;
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:name 
                                   inManagedObjectContext:context]];
    [request setPredicate:predicate];
    NSArray *results = [context executeFetchRequest:request error:&error];
    [request release], request = nil;
    if (error) {
        NSLog(@"%@:%@ Error on fetch %@", [self class], NSStringFromSelector(_cmd), error);
        return nil;
    }
    //NSLog(@"%@:%@ Result of fetch is %@", [self class], NSStringFromSelector(_cmd), results);

    return results;
}

这是皮卡:

NSArray *destinations;
#ifdef SNOW_CLIENT
destinations = [server objectsOfName:@"DestinationsListWeBuy" withPredicate:predicate];

如果我这样做     的NSLog(@ “目的地:%@ \ n”,目的地); 我在日志中看到了所有对象。 如果我试着做

NSLog(@"all:%@\n%@\n%@\n",[[destinations objectAtIndex:0] valueForKey:@"rate"],[[destinations objectAtIndex:0] valueForKey:@"lastUsedACD"],[[destinations objectAtIndex:0] valueForKey:@"lastUsedCallAttempts"]);

我也看到了属性。 但是,如果我尝试围绕对象循环:

for (NSManagedObject *dest in destinations)
{
    NSLog(@"all:%@\n%@\n%@\n",[dest valueForKey:@"rate"],[dest valueForKey:@"lastUsedACD"],[dest valueForKey:@"lastUsedCallAttempts"]);

我在这部分代码中有EXC_BAD_ACCESS:

for (NSManagedObject *dest in destinations)

我所知道的所有调试技术都没有让我理解发生了什么。 (NSZombieEnabled = YES)

如果我以另一种方式循环:

for (NSUInteger count = 0;count < [destinations count]; count++)
    NSLog(@"all:%@\n%@\n%@\n",[[destinations objectAtIndex:count] valueForKey:@"rate"],[[destinations objectAtIndex:count] valueForKey:@"lastUsedACD"],[[destinations objectAtIndex:count] valueForKey:@"lastUsedCallAttempts"]);

我看到所有的钥匙无一例外。所有nsmanagedobject都是子类。 如果我需要为所有子类实现encodeWithCored方法,可以举例说明。

* 更新Marcus * 这就是我从服务器端接收对象的方式:

- (byref NSArray*)allObjects
    {
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (!coordinator) {
            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            [dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey];
            [dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey];
            NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
            [[NSApplication sharedApplication] presentError:error];
            return nil;
        }

        NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
            [moc setPersistentStoreCoordinator:coordinator];
            [moc setUndoManager:nil];
            NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
            [nc addObserver:self
                   selector:@selector(mergeChangesForClient:) 
                       name:NSManagedObjectContextDidSaveNotification
                     object:thirdMOC];
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Carrier" 
                                                  inManagedObjectContext:moc];
        [request setEntity:entity];
        [request setIncludesSubentities:YES];

        NSError *error = nil;
        NSArray *objects = [moc executeFetchRequest:request error:&error];
        [request release], request = nil;
        for (NSManagedObject *carrier in objects) {
            NSSet *destinations = [carrier valueForKeyPath:@"destinationsListForSale"];
            for (NSManagedObject *destination in destinations) [destination addObserver:self forKeyPath:@"rate" options:NSKeyValueObservingOptionNew context:nil];
        }

        if (error) {
            NSLog(@"%@:%@ error: %@", [self class], NSStringFromSelector(_cmd), error);
            return nil;
        }
        return objects;
    }

这就是我在客户端对他们所做的事情:

NSArray *allObjects = [server allObjects];
[carrierArrayController setContent:allObjects];

在这种情况下没有序列化。任何其他方式(如将服务器moc发送到客户端的副本都不起作用,它只是在main.c上生成异常)。

P.S。非常感谢Marcus的核心数据书。

1 个答案:

答案 0 :(得分:0)

  

无法识别的选择器发送到类0x1000a2ed8 2011-03-17 02:15:18.566 snowClient [19380:903] + [AppDelegate encodeWithCoder:]:无法识别的选择器发送到类0x1000a2ed8

这不是核心数据问题。这是您的代码中的错误,您尝试在不响应该方法的对象上调用方法。您需要在出现时跟踪它,以确定您正在尝试序列化AppDelegate。

更新

什么类是0x1000a2ed8?打破异常并打印出对象以查看它是什么。同样,这不是直接的核心数据错误,而是向不响应该消息的对象发送消息。 Core Data可能不再允许您将受管对象作为分布式对象发送。这可能仅仅是过度释放对象的问题。没有进一步调查就无法知道。

第一步:找出对象0x1000a2ed8是什么,看看对象是否从一次运行变为另一次运行。