Оптимизировать загрузку удаленного plist - PullRequest
1 голос
/ 16 февраля 2011

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

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

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

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

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

РЕДАКТИРОВАТЬ: Я пытаюсь использовать 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.");
}   

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

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

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

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

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

0 голосов
/ 16 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...