Оптимизировать загрузку удаленного plist

Я написал приложение, которое загружает информацию из plist, лежащего на моем сервере (надеюсь, с Apple все в порядке :-)). Приложение работает без сбоев в WiFi, но при использовании его в 3G время загрузки слишком велико. Поэтому я хотел бы оптимизировать загрузку моего plist.

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

Кто-нибудь знает, как я могу минимизировать время загрузки и, возможно, опубликовать пример кода?

Прямо сейчас я использую эти две строки для загрузки plist и его сохранения. FETCH_URL, очевидно, мой URL.

NSURL *url = [NSURL URLWithString:FETCH_URL];
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfURL:url];

EDIT: я пытаюсь использовать NSURLConnection, как предлагает Томас Клейсон, но я не могу понять, как преобразовать данные в NSMutableArray.

Это на мой взглядDidLoad:

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:FETCH_URL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) {
        NSLog(@"Connection open.");
    }
    else {
        NSLog(@"Failed connecting.");
    }

Затем у меня есть эти два метода, чтобы проверить, есть ли какие-либо новые данные, и проверить, были ли собраны все данные.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"More data.");
    [receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"Connection successful.");
}   

person simonbs    schedule 16.02.2011    source источник
comment
Проблема заключается во времени загрузки или приложение зависает во время загрузки?   -  person Blitz    schedule 16.02.2011


Ответы (2)


Я понимаю что ты имеешь в виду. Вы захотите использовать NSURLConnection вместо initWithContentsOfURL.

initWithContentsOfURL является синхронным. Это означает, что он будет работать в основном потоке и, таким образом, «зависать» приложение (это связано с тем, что события пользовательского интерфейса должны происходить в основном потоке, и если происходит процесс (ожидание загрузки plist), приложение «остановится» ).

В любом случае, если вы используете NSURLConnection, вы сможете сделать это асинхронно (в другом потоке). Это означает, что какое-то время ваше приложение можно будет использовать, но оно не будет сразу отображать данные из plist. Таким образом, вам нужно будет обработать представление, чтобы обновить данные, когда connectionDidFinishLoading:.

все равно посмотри. :) это очень полезно

person Thomas Clayson    schedule 16.02.2011
comment
Это звучит очень хорошо. Я пробовал читать об этом в документации Apple. Я думаю, что у меня почти получилось, но я не могу понять, как преобразовать или добавить данные в файл NSMutableArray. Я отредактировал свой исходный пост, чтобы показать свой код. Можете ли вы помочь мне преобразовать данные в NSMutableArray, из которого я смогу извлечь их позже? - person simonbs; 16.02.2011
comment
@SimonBS Когда вы запускаете соединение, вы должны создать объект NSMutableData для буферизации данных. В connection:didReceiveData: вы должны добавить данные в этот буфер. Наконец, в connectionDidFinishLoading: вы должны вызвать +[NSPropertyListSerialization propertyListWithData:options:format:error:] (или вариант propertyListFromData:... для iOS до 4.0), чтобы преобразовать данные в тип списка свойств (т. е. NSArray). - person Tony; 16.02.2011
comment
Было бы что-то вроде этого? NSArray *testArray = [NSPropertyListSerialization propertyListWithData:receivedData options:NSPropertyListMutableContainers format:NULL error:NULL]; не работает. Как будто receivedData равно NULL, но я использую [receivedData appendData:data];in didReceiveData - person simonbs; 16.02.2011
comment
Является ли ReceiveData типом NSMutableData? - person Thomas Clayson; 16.02.2011
comment
Да, это заявлено в моем шапке. NSMutableData *receivedData; @property (nonatomic, retain) NSMutableData *receivedData; - person simonbs; 16.02.2011
comment
Я только что поиграл с NSURLConnection и заработал (хотя не уверен, что не так). В любом случае. Со старым кодом до готовности приложения к использованию (на EDGE) уходило 11 секунд, теперь это занимает 1 секунду. в любой сети! Осталось добавить загрузочный экран. Большое тебе спасибо! - person simonbs; 19.02.2011

Минимизировать время загрузки можно только свернув сам plist. Попробуйте различные форматы (двоичный plist, xml plist). Если у вас есть вариант - попробуйте получить json. Насколько мне известно, у него лучшее соотношение информации и размера. Двоичный plist анализируется быстрее всего, а xml plist лучше всего подходит для целей отладки.

person Eimantas    schedule 16.02.2011
comment
10-мегабайтный json-канал по-прежнему остается 10-мегабайтным json-каналом... это поможет сократить только размер файла, а не время загрузки. - person Thomas Clayson; 16.02.2011
comment
Меньший размер файла означает меньшее время загрузки. Нет? - person Eimantas; 16.02.2011
comment
Да, но что происходит, когда набор данных увеличивается в размере? - person Thomas Clayson; 16.02.2011