Цель c, загрузка, проверка и сохранение файла plist

Хорошо, сегодня/на этой неделе у меня небольшой умственный блок, так что я, наверное, тупой, но я не могу заставить это работать. Так что любые советы/помощь, как всегда, будут очень признательны...

Мне нужно мое приложение для iPhone по запросу, чтобы загрузить файл plist с сервера только один раз и сделать его доступным в любое время, когда приложение загружается (в действительности его нужно загрузить только один раз). Но я действительно не думаю, что делаю это правильно... Я использую ASIHTTPRequest для получения файла, и он выполняется в отдельном потоке, чтобы позволить обновлять индикатор выполнения. Загрузка запускается либо при первом запуске, либо по запросу (в данный момент).

Я не получаю никаких ошибок, и с сервером связываются, однако я не знаю, сохраняется ли файл. Мои тесты показывают, что файл не загружается.

Итак, я предполагаю, что мои вопросы:

  • Куда мне сохранить файл? Существуют ли какие-либо правила для этого или это будет проводиться в самом приложении на телефоне?
  • Будет ли этот файл доступен при каждом запуске приложения после его загрузки?
  • Есть лучший способ сделать это?

Некоторый код ниже:

-(void)getPlist
{
    NSArray *docpaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [docpaths objectAtIndex:0];

    NSURL *url = [NSURL URLWithString:plistURL];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDownloadDestinationPath:documentsDirectory];
    [request setDownloadProgressDelegate:progbar];
    [request startSynchronous];
}

Заранее спасибо / извиняюсь, если это глупо, но все еще очень хорошо разбираюсь в этом бизнесе Objective-C.


person rich    schedule 07.07.2011    source источник


Ответы (2)


Если вы используете ASIHTTPRequest, просто используйте встроенную систему кэширования. Не распространяйте свои собственные. Это довольно просто и легко управлять

ASIHTTPRequest может автоматически сохранять загруженные данные в кэше для последующего использования. Это может быть полезно во многих ситуациях:

Вы хотите иметь доступ к данным, когда нет подключения к Интернету, и вы не можете загрузить их снова. Вы хотите загрузить что-либо, только если оно изменилось с момента последней загрузки. хочу скачать один раз

http://allseeing-i.com/ASIHTTPRequest/How-to-use#using_a_download_cache

Чтобы ответить на ваш оригинальный вопрос (ы)

Где сохранить файл? Существуют ли какие-либо правила для этого или это будет проводиться в самом приложении на телефоне?

Просто сохраните его в каталоге документов ваших приложений. Это песочница.

Будет ли этот файл доступен при каждом запуске приложения после его загрузки?

да. Но если пользователь удалил ваше приложение и переустановил его, все ваши кешированные файлы будут удалены. Разберитесь с ситуацией.

Есть ли лучший способ сделать это?

Я не вижу ничего плохого в вашей текущей реализации. Если вы столкнулись с проблемами, проверьте объект запроса на наличие ошибок и/или проверьте возвращаемый код состояния HTTP int statusCode = [request responseStatusCode];.

Получите путь к документам по вашему (внутреннему на вашем устройстве) пути:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
person Henrik P. Hessel    schedule 07.07.2011
comment
Спасибо за отличный/быстрый ответ. Посмотрим на кеширующий ASIHTTPRequest. - person rich; 07.07.2011
comment
Я рад, что этот ответ помог вам. Не забывайте голосовать за полезные ответы ;) - person Henrik P. Hessel; 07.07.2011
comment
Я сделаю это немного позже, как только разберусь с этим :) Пока я занимаюсь этим, что касается пути назначения загрузки, в документах ASIHTTP есть такие примеры, как: [request setDownloadDestinationPath:@/Users/ben/Desktop/my_file.txt] Итак , я немного запутался, где находится каталог документов. (извините за мой миллион и 1 вопрос здесь!) - person rich; 07.07.2011
comment
Это не путь на рабочем столе! Я собираюсь отредактировать свой ответ. - person Henrik P. Hessel; 07.07.2011
comment
Поэтому я запутался! Теперь все работает: D Спасибо за отличный ответ. Однако мне также нужно было использовать ответ от @benzado. - person rich; 07.07.2011

Я думаю, что путь назначения загрузки должен быть путем к файлу, а не просто каталогом для сохранения файла. Попробуйте следующее:

-(void)getPlist
{
    NSArray *docpaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [docpaths objectAtIndex:0];
    // path to the new destination file
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"foo.bar"];

    NSURL *url = [NSURL URLWithString:plistURL];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDownloadDestinationPath:path]; // use the file path
    [request setDownloadProgressDelegate:progbar];
    [request startSynchronous];
}
person benzado    schedule 07.07.2011