Как загрузить контент в TableView, не блокируя пользовательский интерфейс? - PullRequest
3 голосов
/ 14 сентября 2011

Я работаю над TableView, контроллер которого загружает данные из веб-канала, анализирует и заполняет его содержимое в этом TableView. Фид предоставляет данные только порциями по 10 штук. Так, например, загрузка данных при наличии 112 элементов может потребовать около 12 запросов к серверу. Я хотел бы сделать эти запросы, не блокируя экран пользователя, и он должен загружать данные по порядку, как если бы он не мог загружать элементы на странице 5, если он уже не извлек предыдущий (1,2,3,4 в этом точном порядке для пример).

Есть идеи, как это реализовать?

Спасибо заранее за помощь,

Stephane

Ответы [ 2 ]

5 голосов
/ 14 сентября 2011

Сделайте ваши веб-звонки асинхронными.Не выполняйте веб-вызовы в главном потоке пользовательского интерфейса ...

Например, если вы используете библиотеку ASIHttp для выполнения http-вызовов (это построено поверх Apple NSURLConnection ), сделать асинхронный запрос так же просто, как -

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];

И при получении данных эти обратные вызовы селектора вызываются -

- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

Это будетопределенно сделайте ваш интерфейс отзывчивым ...

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

1 голос
/ 14 сентября 2011

Вам не нужно использовать другой API, и вы можете использовать собственный NSURLConnection от Apple. Он может получать данные синхронно или асинхронно. Конечно, последнее необходимо в вашем случае. Вы сохраняете данные в методах делегатов запросов.

– connection:didReceiveResponse:
– connection:didReceiveData:
– connection:didFailWithError:
– connectionDidFinishLoading:

Также см. Мой недавний более полный ответ на этот вопрос .

...