Задача c, загрузка, проверка и поддержание доступности файла plist - PullRequest
2 голосов
/ 07 июля 2011

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

Мне нужно мое приложение для 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.

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

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

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

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

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

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

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

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

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

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

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

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

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

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
1 голос
/ 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];
}
...