Objective-C вызывает javascript в UIWebView и вызывает Objective-C;проблемы с потоками - PullRequest
1 голос
/ 21 февраля 2012

У меня есть приложение на основе UIWebView, которое хранит некоторые состояния. У меня есть родная панель вкладок и верхняя панель, однако. Что мне нужно, так это то, что когда я нажимаю на родную панель, я сохраняю данные, хранящиеся в UIWebView.

Чтобы сделать это, я вызвал valuJavaScriptByString, чтобы создать объект JSON, и он выполняет обратный вызов Objective-C через протокол UIWebViewDelegate.

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

Есть идеи, как решить эту проблему?

Обновление: чтобы лучше объяснить проблему: -

  • У меня есть HTML-страница с формой, в которую кто-то помещает некоторые данные.
  • Моя панель вкладок является родной.
  • При нажатии кнопки на панели вкладок я хочу сохранить данные из HTML в модели Objective-C, и представление должно измениться на другое представление.

Что происходит, когда я нажимаю кнопку, на странице происходит вызов javascript (для создания строки JSON для отправки в Objective-C), и эти данные сохраняются в модели obj-c. Однако это происходит асинхронно. Так что мой экран меняется до того, как данные загружаются в модель. Если я обновлю следующий экран, он показывает правильные данные. Мне было интересно, есть ли способ обойти это.

Обратите внимание, я знаю, как вызывать функции OBjective-C из WebViews. Для этого мы все равно используем JSOBjBridge.

1 Ответ

0 голосов
/ 21 февраля 2012

Просто добавьте что-то вроде этого @"some_var = MAKE_JSON(); window.location = \"myapp://callback/\" + escape(some_var)" в конце своего кода JavaScript, который вы передадите для оценкиJavaScriptByString:

В делегате UIWebView реализуйте webView: shouldStartLoadWithRequest: navigationType: и перехватывайте все URL с префиксом myapp://вот так:

- (BOOL)           webView: (UIWebView *) webView
shouldStartLoadWithRequest: (NSURLRequest *) request
            navigationType: (UIWebViewNavigationType) navigationType {
    NSString *url = @"myapp://";
    NSString *path = request.mainDocumentURL.relativePath;
    NSString *callbackURL = @"callback/";
    if ( [path hasPrefix:url] ) {
        path = [path substringFromIndex:[url length]];
        if ( [relPath hasPrefix:callbackURL] ) {
            NSString *json = [path substringFromIndex:[callbackURL length]];
            //TODO: Work with json
        }
        return NO;
    }
    return [super webView:webView shouldStartLoadWithRequest:request navigationType: navigationType];
}

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

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