YouTube UITableView ячеек, использующих поток блокировки UIWebView? - PullRequest
1 голос
/ 03 декабря 2010

У меня есть UITableView, который отображает данные YouTube, такие как название видео и дата.Я также отображаю UIWebView (75x75px) для каждого UITableViewCell, который загружает строку HTML.

вот соответствующий код для - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath:

UIWebView *iconView = (UIWebView*)[cell.contentView viewWithTag:2];
[self embedYouTube:videoUrl frame:CGRectMake(0, 0, 75, 75) webView:iconView];

и embedYouTube функция:

- (void)embedYouTube:(NSString*)url frame:(CGRect)frame webView:(UIWebView*)webView {
 if([loadedIconsArray containsObject:webView])
  return;
    NSString *youTubeVideoHTML = @"<html><head>\
 <body style=\"margin:0\">\
 <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \
 width=\"%0.0f\" height=\"%0.0f\"></embed>\
 </body></html>";

    NSString *html = [NSString stringWithFormat:youTubeVideoHTML, url, frame.size.width, frame.size.height];

    [webView loadHTMLString:html baseURL:nil];
 [loadedIconsArray addObject:webView];
}

loadedIconsArray это NSMutableArray

проблема:

Когда я загружаю свое представление YouTube, кажется, что основнойпоток блокируется, пока эти UIWebView объекты загружают HTML.через несколько секунд все работает как положено.Я замечаю, что испытываю это отставание только после первой установки приложения.все остальные приложения / представления работают нормально.

Почему я испытываю эту "задержку" или блокировку потоков?

Как мне избежать этого?

Ответы [ 3 ]

3 голосов
/ 09 декабря 2010

Начнем с того, что это , а не проблема, вызванная доступом к сети в главном потоке (по крайней мере, не доступ к сети, которой вы управляете).Метод UIWebView, вызываемый в главном потоке, называется loadHTMLString: baseURL:, который просто вставляет указанную строку в веб-представление как его HTML-содержимое.Содержимое указанной HTML-строки подразумевает сетевой запрос к YouTube, но это не создает инициируемый пользователем сетевой запрос в главном потоке, как щелчок по ссылке в веб-представлении.

Любое предложениевыполнять эту операцию в фоновом потоке неправильно и почти наверняка приведет к сбою.Любое взаимодействие с веб-представлением должно быть в основном потоке;iOS выдаст ошибку сбоя даже для создания экземпляра веб-представления в фоновом потоке.

К сожалению, в этом и заключается проблема, с этой задержкой вы ничего не можете сделать.Когда UIWebView видит тег <embed> в указанном HTML и определяет, что контент должен поступать с YouTube, он запускает собственный проигрыватель YouTube для воспроизведения видео.Задержка может быть вызвана временем, которое требуется нативному плееру для запуска, оно может быть вызвано тем, что нативный игрок связывается с YouTube, оно может быть вызвано гномами, которые живут в подвале нативного плеера.Я не знаю причину, и, поскольку нативный проигрыватель является совершенно непрозрачным процессом (если не считать джейлбрейка устройств и использования некоторых библиотек с дизассемблером), у меня нет хорошего предложения, как это выяснить.Даже если бы вы узнали, вы почти наверняка ничего не могли бы с этим поделать.

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

0 голосов
/ 09 декабря 2010

Я не уверен в этом, но я подумал, что это может помочь вам, поэтому подумал опубликовать этот ответ ...

Вы можете просто проверить и выяснить, вызывается ли "webviewDidLoad", когда видеопроигрыватель прекращает обработку видео.

если он действительно вызывает то, что я бы порекомендовал сделать, это решить какую-то другую вещь, пока не будет вызвана «webviewDidload», то есть собственный проигрыватель прекращает обрабатывать видео, как youtube выдает вращающееся белое колесо, пока не загружает видео, а затем отображает веб-представление .

Надеюсь, я правильно понял ваш вопрос, и это может немного вам помочь.

0 голосов
/ 06 декабря 2010

Любой доступ к сети НЕ должен выполняться в главном потоке. Используйте асинхронный API для загрузки контента. А пока просто предоставьте простое изображение-заполнитель / local-webview для отображения.

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