2012-09-11 158 views
0

我在webViewDidFinishLoad委託方法裏面有一些代碼,並且我需要一些方法來告訴這個代碼已經完成了從我的代碼的完全不同部分的另一個方法中執行。這可能嗎?基本上我想要做的是這樣的:iOS如何判斷webViewDidFinishLoad何時完成?

-(void) myMethod 
{ 
    // do stuff that causes webViewDidFinishLoad to be called 

    if (webViewDidFinishLoad has finished executing) 
    { 
     // do stuff with outputString 
    } 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    outputString = [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"myJSFunction('%@')",jsInputString]]; 
} 

我看着this answer已經和它沒有任何意義了我。

我應該在myMethod中添加,我可以確定webViewDidFinishLoad只會被調用一次。

+0

我認爲,當發現需要阻塞主線程等待委託或通知時,這是一種代碼味道。你想要完成什麼?也許有另一種方法來解決你的問題。 –

+0

Carl,我的webViewDidFinishLoad委託方法包含對stringByEvaluatingJavaScriptFromString的調用。在繼續使用myMethod中的代碼之前,我需要調用的結果。 – JMLdev

+0

然後,如果可能,請在網絡視圖加載完成之前不要調用myMethod。如果它從用戶輸入禁用相關的控件,直到加載後。這會工作嗎? –

回答

1

儘量避免等待其他方法的代表和通知 - 做的工作,當他們打電話給你的班級時,這取決於他們。直到獲得委託消息之前,請勿撥打myMethod。如果從用戶輸入調用myMethod,則禁用關聯的控件,直到Web視圖加載完成。

0
  • 你可以使用UIWebView的伊娃loading
  • 你可以使用自己的共享布爾標誌爲伊娃並將其設置在webViewDidFinishLoad

但是,也許你可以重新考慮你的設計,並在webViewDidFinishLoad做加載完成後該怎麼做。

2

您可以隨時設置布爾值來指示web視圖是否已完成加載。 且布爾值會在網頁視圖的委託方法來改變:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    loadFinished = YES; 
} 

然後在你自己的方法,檢查「loadFinished」將執行的任務。 您必須設置<UIWebViewDelegate>接口才能使用此代理方法

0

爲什麼不嘗試GCD?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // WebView load content here 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     // load myMethod 

    }); 
}); 
0

使用布爾和的webViewDidFinishLoad最後一行其值設置爲YES

然後檢查你的myMethod這樣的:

-(void) myMethod 
{ 
    // do stuff that causes webViewDidFinishLoad to be called 

    if (yourBoolean == YES) 
    { 
     // do more stuff 
    } 
} 

應該做你的工作。

0

在webViewDidFinishLoad中,您將通知發佈到您的「myMethod」代碼部分。 事情是這樣的:

在UIWebView的

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"webview_finished" object:self userInfo:nil]; 
} 
在 「myMethod的」 代碼的一部分

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod) name:@"webview_finished" object:nil]; 
} 
相關問題