2011-07-06 2 views
2

Должен ли я проверить, существует ли файл по заданному пути при попытке чтения данных в объект NSData? Прямо сейчас я не делаю в данный момент, но мой код работает, так как мой массив, который должен быть заполнен данными из файла, будет установлен в nil, и я могу позже в своем приложении проверить, равен ли этот массив нулю. Но я думаю, что код, возможно, «уродлив» и будет работать лучше, если бы я сделал чек (например, тот, который был прокомментирован).Objective-C NSData initWithContentsOfFile, проверьте, существует ли файл?

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

Мне кажется разумным, что я отменил бы утверждение if, чтобы покончить с предложением else.

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

... Do the rest of your code 

компания Apple предлагает here, что вы должны попытаться выполнить операцию, такие как загрузка данных, как вы предложили. Пока вы не пытаетесь сделать [[NSManager defaultManager] fileExistsAtPath:path], вы не будете вводить условия гонки.

+0

Как будет происходить ситуация гонки при использовании метода fileExistsAtPath? –

+0

Первый пример, о котором я могу думать, - это если вы используете 'fileExistsAtPath', чтобы убедиться, что ваша структура каталогов настроена, например. 'Documents/myAppFiles/test.txt' после получения' YES' вы можете быть счастливы и продолжить и сохранить файл. Возможно, что между вашим чеком и операцией сохранения, с которой может появиться фоновый поток, и удалением структуры каталогов, на которую вы полагаетесь, что приведет к тому, что ваш файл не будет сохранен. В документах Apple есть дополнительная информация http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html. –

1

У вас нет, и это может ввести гонку, поэтому она будет более «уродливой». Просто проверьте, есть ли codedData, если nil в случае отказа чтения.

Смежные вопросы