在这种情况下如何确定是不是发生错误(Objective-C)
Posted
技术标签:
【中文标题】在这种情况下如何确定是不是发生错误(Objective-C)【英文标题】:How to Determine if Error Occured in this Case (Objective-C)在这种情况下如何确定是否发生错误(Objective-C) 【发布时间】:2011-03-25 04:42:09 【问题描述】:大家好,我有这个功能:
//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 被指定为无符号整数,所以我什至不能给它赋值 -1 并在以后检查是否有 -1 如果我想的话。
【问题讨论】:
【参考方案1】:在调用executeFetchRequest::
之前将error
设置为nil
。如果error
之后不是nil
,则它被设置,因此发生错误。
count
检查掩盖nil
检查的原因是因为发送到nil
的任何消息都返回nil
,在这种情况下也是0。这可以通过首先检查nil
轻松解决,或修改您的if
语句,使其如下:
if (fetchedObjects && [fetchedObjects count] == 0)
对于countForFetchRequest::
NSNotFound
的情况,发生错误时返回,所以检查一下。
【讨论】:
那么如果数组为nil,即为空,error会被设置成什么?nil
不等于空。空数组表示未获取任何对象。 nil
被返回意味着发生了错误。见developer.apple.com/library/ios/#documentation/Cocoa/Reference/…
好的,谢谢!如果我没有遇到另一个让我感到困惑的案例,我会接受这个作为答案(请参阅上面的编辑部分)。
如果可行,请接受答案,不要在原件上附加另一个问题,而是创建一个新问题!这不是论坛!
我宁愿在一个线程中问类似的问题,使所有内容井井有条,易于查找,尤其是对于有相同问题的其他人。【参考方案2】:
从countForFetchRequest:error:
的文档中复制并粘贴
返回值
如果给定的 fetch 请求被传递给 executeFetchRequest:error: 或 NSNotFound 如果发生错误,则该请求将返回的对象数。
所以,
if (numEntities == NSNotFound)
// Handle the error
【讨论】:
哇,好的,这在我的文档副本中没有提到:“返回值如果已将给定的获取请求传递给 executeFetchRequest:error: 将返回的对象数。”感谢您的帮助! 是的 - 你是对的。 Xcode 3.2 文档没有提到 NSNotFound。带有 Xcode 4 和在线版本的都可以。以上是关于在这种情况下如何确定是不是发生错误(Objective-C)的主要内容,如果未能解决你的问题,请参考以下文章
使用 HttpClient.GetAsync() 时如何确定 404 响应状态
如果执行嵌套的异步调用,则函数运行两次,否则运行一次。需要帮助来预先确定何时会发生这种情况