检索或创建对象

时间:2014-04-07 22:32:55

标签: ios objective-c

以下方法是免费的斯坦福iOS 7课程第13周的代码。我的问题与if else子句中的代码有关。在第一部分中,它表示if(!matches ...),我假设这意味着从获取请求中没有返回任何内容。但是,当教师谈到控制语句的第三部分时,else,他说,如果在请求中找不到对象,我们就会创建该对象,并因此创建该代码的对象

photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:context];

但是,如果由于找不到对象而创建了对象,那么第一部分中不会if(!matches...也意味着找不到匹配项。如果没有,if(!matches处理什么情况?

+(Photo *)photoWithFlickrInfo:(NSDictionary *)photoDictionary
       inManagedObjectContext:(NSManagedObjectContext *)context
{
    Photo *photo = nil;
    NSString *unique = photoDictionary[FLICKR_PHOTO_ID];
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Photo"];
    request.predicate = [NSPredicate predicateWithFormat:@"unique = ", unique];
    NSError *error;
    NSArray *matches = [context executeFetchRequest:request error:&error];
    if (!matches || error || ([matches count] > 1) ){
        //handle error

    }else if([matches count]){
        photo = [matches firstObject];

    }else{
        photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:context];

    }


    return photo;
}

2 个答案:

答案 0 :(得分:1)

他做了一些偷偷摸摸的事......

当满足三个条件中的一个或多个时,第一个条件为真:

  1. !matches检查[context executeFetchRequest:request error:&error]是否返回nil。
  2. error检查错误是否已设置(不是nil)。
  3. [matches count] > 1检查返回的数组是否有多个条目。
  4. 第二个条件检查数组的计数。这确实应该是else if (matches.count == 1,因为如果计数大于1,那么它将被第一个条件捕获。如果计数为零,那么这将不执行,因为if (0)被评估为if (NO)

    如果[context executeFetchRequest:request error:&error]返回一个空的但不是nil的数组,则只会运行else。

答案 1 :(得分:0)

如果请求和所有请求都有效,则没有与请求匹配的项,则executeFetchRequest将不返回任何错误和空数组。因此,matches != nil[matches count] != 0