Нужна помощь для быстрого поиска значения в iOS Property List (plist)? - PullRequest
1 голос
/ 21 октября 2011

У меня в настоящее время есть файл plist в моем проекте iOS, который загружается из Интернета, когда доступны обновления, и содержит список новостных статей вместе с изображениями.

Приложение кэширует изображения на iPhone для автономного доступа, в настоящее время я пытаюсь написать функцию, которая будет часто очищать кэшированные файлы.

В настоящее время у меня есть этот код, который ищет в папке Temp изображения и затем удаляет их, однако для каждого найденного изображения я хотел бы проверить, существует ли имя файла как значение в списке, сохраненном как NSDictionary перед удалением, однако Я не уверен в быстром способе поиска NSDictionary без необходимости в операторе for.

Любые советы будут великолепны.

 NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:TMP error:nil];
    if (files == nil) {
        // error...
        NSLog(@"no files found");
    }

    for (NSString *file in files) {

        NSString *uniquePath = [TMP stringByAppendingPathComponent: file];
        if([file rangeOfString: @".png" options: NSCaseInsensitiveSearch].location != NSNotFound)
        {
            NSLog(@"%@", file);   


            if ([[NSFileManager defaultManager] removeItemAtPath: uniquePath error: NULL]  == YES)
                NSLog (@"Remove successful");
            else
                NSLog (@"Remove failed");

        }
    }  

EDIT

В настоящее время я добавил это, но не уверен, что это лучший способ сделать это, но это работает.

 NSArray *newsArray = [self.newsData allValues];

 // Convert the Array into a string
 NSString *newsString = [newsArray description];

 // Perform Range Search.
 NSRange range;
 range = [newsString rangeOfString : filename];

 if (range.location != NSNotFound) {
    NSLog(@"The file exists in the plist %@", filename);
 } else {
     // Delete the file
 }

Ответы [ 2 ]

0 голосов
/ 21 октября 2011

Поскольку вам не важна последовательность файлов в plist или папке, и у вас, очевидно, не будет дублирования, используйте NSSet, а не NSArray, а затем используйте метод intersect (intersectsSet :), чтобы найти пересечение.

0 голосов
/ 21 октября 2011

Вы можете уменьшить массив так, чтобы он содержал только интересующие вас объекты, используя NSPredicate, а затем быстро перебрать объекты, которые вы хотите удалить. Вот так:

NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:TMP error:nil];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] '.png'"];

NSArray *filteredArray = [files filteredArrayUsingPredicate:thePredicate];

for (NSString *file in filteredArray) {

    NSString *uniquePath = [TMP stringByAppendingPathComponent:file];

     if ([[NSFileManager defaultManager] removeItemAtPath: uniquePath error: NULL])
            NSLog (@"Remove successful");
     else
        NSLog (@"Remove failed");

}

Это будет означать, что цикл for зацикливается только на интересующих вас объектах.

...