如何确定此案例中是否存在错误(Objective-C)

时间:2011-03-25 04:42:09

标签: objective-c cocoa nserror

嘿伙计们,我有这个功能:

//retrieves checksum within core data store, returns 0 if a checksum has not been stored
-(double)getStoredChecksum {
    NSError *error;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"DataFeedManager" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    //+for (NSManagedObject* item in fetchedObjects) //REMOVE
        //+[[self managedObjectContext] deleteObject:item]; //REMOVE FOR CLEARING CHECKSUM CONTENTS

    if ([fetchedObjects count] == 0){ //array is empty
        NSLog(@"FETCHED OBJECTS IS EMPTY");
        checksumStored = NO;
        return 0;
    }
    if (fetchedObjects == nil) {
        NSLog(@"Error while fetching\n%@",
              ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
    }
    if ([fetchedObjects count] > 1)
        NSLog(@"====BAD:Multiple Checksums Retrieved!!!!====");
    checksumStored = YES;
    double returnable = [[[fetchedObjects objectAtIndex:0] valueForKey:@"lastUpdateCheckSum"] doubleValue];
    return returnable;
}//getStoredChecksum()

如您所见,它执行获取请求,但我不确定如何检查是否发生了错误。正如你所看到的,我正在通过[fetchedObjects count] == 0检查数组是否为空,但是,我听说如果发生错误并且数组为nil,则返回0表示计数,因此它是安全的以这种方式测试数组空虚,但它掩盖了我对空数组的检查。因此问题是我没有确定的方法来检查是否发生了错误。关于我应该如何做的任何想法?

提前致谢!

编辑:

在这种情况下如何检查错误?

NSUInteger numEntities = [[self managedObjectContext] countForFetchRequest:fetchRequest error:&error];

由于NSUInteger被指定为unsigned int,所以我甚至不能为它赋值-1,如果我愿意,请稍后检查-1。

2 个答案:

答案 0 :(得分:2)

在致电error之前将nil设为executeFetchRequest::。如果error之后nil不是count,那么它就会被设置,从而发生错误。

nil检查屏蔽nil检查的原因是因为发送到nil的任何消息都返回nil,在这种情况下也是0.这很容易通过首先检查if来修复,或修改您的if (fetchedObjects && [fetchedObjects count] == 0){ 语句,使其如下所示:

countForFetchRequest::

对于发生错误时返回NSNotFound {{1}}的情况,请检查一下。

答案 1 :(得分:2)

复制&粘贴自countForFetchRequest:error:

的文档
  

返回值

     

如果传递给executeFetchRequest,则返回给定获取请求的对象数:error:,如果发生错误,则返回NSNotFound。

所以,

if (numEntities == NSNotFound) {
    // Handle the error
}