Objective-C NSData initWithContentsOfFile,检查文件是否存在?

时间:2011-07-06 14:11:39

标签: objective-c nsdata

在尝试将数据读入NSData对象时,是否应检查给定路径中是​​否存在文件?现在我不是在做,但我的代码工作,因为我的数组应该被填充来自文件的数据将被设置为nil我可以稍后在我的应用程序中检查该数组是否为零。但我认为代码可能“丑陋”,如果我做了检查(如注释代码中的那个),它会更好用。

NSData *codedData = [[NSData alloc] initWithContentsOfFile:[CareersParser dataFilePath]];

    /*
    if (codedData != nil) {
        //do the below (not commented out code)
    } else {

        //file doesn't exist at the given path
        [codedData release];
        return nil;
    }
    */

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:codedData];
    NSArray *careers = [unarchiver decodeObjectForKey:kDataKey];    
    [unarchiver finishDecoding];

    NSMutableArray *ids = [[NSMutableArray alloc] init];

    for (Career *career in careers) {
        [ids addObject:[career id]];
    }

    // Sort the array in an orderly fashion
    NSArray *sortedIds = [ids sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

    // Release allocated memory
    [ids release];
    [unarchiver release];
    [codedData release];

    return sortedIds;

2 个答案:

答案 0 :(得分:2)

对我来说这似乎是明智的,我会颠倒if语句以废除else子句。

if (nil == codedDate) {
  [codedData release];
  return nil;
}

... Do the rest of your code
Apple建议您here尝试执行操作,例如按照您的建议加载数据。只要您不尝试[[NSManager defaultManager] fileExistsAtPath:path],您就不会引入竞争条件。

答案 1 :(得分:1)

你没有,这可能引入一场比赛,所以它会更“丑陋”。如果读取失败,请检查 codedData 是否为nil。