UIWebView в мультипотоке ViewController

Попробуйте это:

google.maps.event.addListener(map, "click", function(event) {
    infowindow.close();
});

Это довольно просто и должно работать.

9
задан Peter Hosey 27 May 2010 в 13:38
поделиться

4 ответа

В общем, вы должны отменить любые фоновые операции, когда представление, которое их использует, исчезает. Пример:

- (void)viewWillDisappear:(BOOL)animated {
  [operationQueue cancelAllOperations];
  [super viewWillDisappear:animated;
}
1
ответ дан 4 December 2019 в 06:02
поделиться

Я не уверен, что именно происходит, основываясь на вашем коде, но похоже, что viewDidAppear вызывается и создает второй поток, а затем вы уходите от контроллера и отпускаете его , а затем второй поток завершает работу и вызывает performSelectorOnMainThread для выпущенного объекта «self». Я думаю, вам просто нужно проверить, что релиз не произошел?

Сообщение об ошибке, которое вы получаете, подразумевает, что вы запускаете какой-то код UIKit из своего второго потока. Apple недавно добавила несколько проверок для потоковых вызовов UIKit, и я думаю, вам, вероятно, просто нужно реорганизовать функцию загрузки, чтобы обновить пользовательский интерфейс в основном потоке, вместо того, чтобы вызывать функции UIWebView из второго потока.

Надеюсь, что это поможет!

0
ответ дан 4 December 2019 в 06:02
поделиться

У меня сейчас аналогичная проблема в моем приложении. Контроллер представления, который отображает UIWebView, передается контроллеру навигации и запускает фоновый поток для получения данных. Если вы нажмете кнопку «Назад» до завершения потока, приложение выйдет из строя с тем же сообщением об ошибке.

Проблема, похоже, в том, что NSThread сохраняет цель (себя) и объект (аргумент) и освобождает это после того, как метод был запущен - к сожалению, он освобождает оба из потока. Таким образом, когда создается контроллер, счетчик удержания равен 1, когда поток запускается, контроллер получает счетчик удержания равным 2. Когда вы открываете контроллер до того, как поток завершен, контроллер навигации освобождает контроллер, что приводит к сохранить счет 1. Пока все в порядке - но если поток наконец завершается, NSThread освобождает контроллер, что приводит к сохранению счетчика 0 и немедленному освобождению из потока. Это заставляет UIWebView (который выпущен в методе dealloc контроллера) вызывать это исключение предупреждения потока и сбой.

Я успешно справился с этим, используя [[самосохранение] автозапуск] в качестве последнего оператор в потоке (прямо перед тем, как поток освободит свой пул). Это гарантирует, что объект контроллера не будет освобожден немедленно, а будет помечен как автоматически освобожденный и освобожден позже в цикле выполнения основного потока. Однако это несколько грязный прием, и я предпочел бы найти лучшее решение.

что приводит к сохранению счетчика 0 и немедленному освобождению из потока. Это заставляет UIWebView (который выпущен в методе dealloc контроллера) вызывать это исключение предупреждения потока и сбой.

Я успешно справился с этим, используя [[самосохранение] автозапуск] в качестве последнего в потоке (прямо перед тем, как поток освободит свой пул). Это гарантирует, что объект контроллера не освобождается немедленно, а помечается как автоматически освобожденный и освобождается позже в цикле выполнения основного потока. Однако это несколько грязный прием, и я предпочел бы найти лучшее решение.

что приводит к сохранению счетчика 0 и немедленному освобождению из потока. Это заставляет UIWebView (который выпущен в методе dealloc контроллера) вызывать это исключение предупреждения потока и сбой.

Я успешно справился с этим, используя [[самосохранение] автозапуск] в качестве последнего в потоке (прямо перед тем, как поток освободит свой пул). Это гарантирует, что объект контроллера не будет освобожден немедленно, а будет помечен как автоматически освобожденный и освобожден позже в цикле выполнения основного потока. Однако это несколько грязный прием, и я предпочел бы найти лучшее решение.

Я успешно справился с этой проблемой, используя [[самосохранение] автозапуск] в качестве последнего оператора в потоке (прямо перед тем, как поток освободит свой пул). Это гарантирует, что объект контроллера не будет освобожден немедленно, а будет помечен как автоматически освобожденный и освобожден позже в цикле выполнения основного потока. Однако это несколько грязный прием, и я предпочел бы найти лучшее решение.

Я успешно справился с этой проблемой, используя [[самосохранение] автозапуск] в качестве последнего оператора в потоке (прямо перед тем, как поток освободит свой пул). Это гарантирует, что объект контроллера не будет освобожден немедленно, а будет помечен как автоматически освобожденный и освобожден позже в цикле выполнения основного потока. Однако это несколько грязный прием, и я предпочел бы найти лучшее решение.

1
ответ дан 4 December 2019 в 06:02
поделиться

Я попробовал оба решения, опубликованные выше, [operationQueue cancelAllOperations] и [[self keep] autorelease] . Однако при быстром щелчке по-прежнему остаются случаи, когда счетчик удержания падает до 0 и класс освобождается во вторичном потоке. Во избежание сбоя, я поместил в свой dealloc следующее:

    if ([NSThread isMainThread]) {
        [super dealloc];
    }

, что является очевидной утечкой, но, похоже, меньшим из двух зол.

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

0
ответ дан 4 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: