2013-10-30 110 views
7

簡短版本:在我的應用程序中,後臺獲取的工作方式與魅力不同,只是當我嘗試在webview中加載內容時,它什麼也不做!在後臺加載UIWebView

龍版本:我設置項目中的權利能力,設置取間隔和落實

- (void) application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 

一種方法,在實例和它的作品。但是,爲了完成我的後臺獲取,我需要在UIWebView中加載一些內容。這不起作用。簡單的過程有點「找不着北」當我打電話:

[myWebview loadRequest:request]; 

(當然在前臺的時候工作,但什麼都不做的時候在後臺)。

我還試圖迫使在主線程加載web視圖,但隨後該系統簡單地制止它,直到在前臺模式下的應用程序回報(很有意義,我們在後臺!)

所以,有一種方法可以在後臺加載UIWebView?請注意,我不能簡單地使用NSURLSession下載內容,因爲網頁包含裝載一些框架的JavaScript(並且我不能要求重新設計網頁)。

編輯:可能是我沒有足夠的CREAR當我寫的問題,但它試圖在main_queue執行任務(與dispatch_asyncØ同樣的方法),同時在後臺獲取不起作用。我在嘗試之前詢問...

+0

你什麼時候打電話給完成處理程序? –

+0

我在加載web視圖後等待調用它,但加載甚至沒有啓動 –

+0

當您在後臺運行時,web視圖是否在視圖層次結構中(即,window屬性是否返回某個內容) ? –

回答

2

在11/11/2013(iOS 7.0.3)看起來像是不可能的。 我只是離開這個答案,所以人們不會得到錯誤的信息。

愛德華多·阿里納斯普拉達的解決方案完美地工作,如果你的應用是在前景,但不是在一個後臺獲取黯然。

+1

現在仍然如此:2014年4月27日。 –

3

當您想要更新用戶界面的元素時,您必須在應用程序的主隊列(或線程)中訪問它們。我推薦的是讓你在後臺獲得你需要的數據,但是當你需要更新你的UIWebView時,請在主線程中進行。你可以這樣說:

dispatch_async(dispatch_get_main_queue(), ^{ 

     // Load fetched data in the Web View 

    }); 

,或者你可以創建一個可以更新的UIWebView的數據的方法和使用從後臺線程調用它:

[self performSelectorOnMainThread:@selector(method:) withObject:fetchedData waitUntilDone:YES]; 

這將確保您訪問UIWebView從正確的線程。

希望這會有所幫助。

+0

不,它不工作!我已經嘗試過了,但正如我寫的,如果我在主隊列中執行Web視圖加載,塊執行會暫停,直到應用程序返回前臺(然後立即啓動,但當然爲時已晚......) –

+0

意思是說你需要將代碼分成兩部分。一個從服務器獲取數據(我相信你期望收到一些html和javascript),另一個將獲取的數據加載到'UIWebView'中。第一部分應該從後臺線程調用,所以它不會阻塞用戶界面,一旦你獲得了數據,你應該在主線程中更新'UIWebView',以確保視圖得到更新。考慮到這一點,使用'[myWebview loadRequest:request];'可能不適合你,你應該找到另一種方式來更新你的web視圖。 –

+0

我不能分開傷心...我下載的JavaScript觸發了一些更多的下載,所以我需要web視圖來執行它們。 –