2012-07-13 130 views
0

我正在寫一個iPad應用程序,從Web服務器上的XML文件翻出各種座標,分析該信息,並呈現在屏幕上。從URL中不斷獲取新數據的最佳方法?

我在想,如果您有任何的對我怎麼可能有它不斷刷新數據,比如提示/建議,每一秒(因爲計算機程序更新每隔幾秒鐘的服務器上的XML文件)。謝謝!

+0

爲什麼不使用'NSTimer'? – Imirak 2012-07-13 01:51:22

+0

@Imirak是的,好像我將與NSOperation一起使用它。謝謝! – Chris 2012-07-13 04:11:44

回答

2

你肯定會需要實現這種多線程後臺操作,或者您的應用程序將完全沒有反應。在繼續之前,我必須指出,不斷查詢服務器以查看應用程序的整個執行過程是一個糟糕的主意,它不僅會咀嚼數據,而且必須保持Wi-Fi/3G/4G天線不間斷運行,否則用戶的電池快得多。

我會考慮放寬要求,每隔10秒左右拉數據(因爲服務器只會每隔幾秒更新一次,並且必須考慮下載和呈現當前抓取的合作伙伴的時間) ,甚至等待用戶按下刷新按鈕等。

要回答這個問題,有幾種方法可以做到這一點,其中最簡單的方法可能是使用像​​這樣的框架(不再維護它儘管如此,對於現代化項目,還有像AFNetworking這樣的圖書館)。他們處理來自服務器的數據異步下載以及許多其他有用的網絡功能。

您需求的理想的過程看起來是這樣的:

  1. 創建NSOperationQueue(或添加網絡庫隊列)
  2. 使用的NSTimer保持創建子類的NSOperation從服務器做下載(或再次,等同於網絡庫的功能)。每發送一個請求到隊列,它都會發送一個x秒。
  3. 一旦完成下載,更新爲新數據的UI(注意,改變用戶界面的任何功能已經從主線程來完成,因此,如果您處理這個在你的NSOperation /等你將不得不使用performSelectorOnMainThread或同等學額!)

希望有所幫助!如果你不希望包括外部庫,我也有一個創建執行NSURLConnection的,並將其發送給NSOperationQueue,併發執行他們一個子類的NSOperation的情況下,一個小樣本項目。您可以輕鬆修改它,一次只執行一個操作,更改NSURLConnection以下載並解析服務器數據,然後更新主線程。 It's here如果你有興趣。

2

看一看NSTimer及其scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:方法

一個可行的解決方案可能是

[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:refreshData userInfo: nil repeats:YES ] 

和方法的調用對象

-(void) refreshData { 
    //Do your call here 
} 
0

考慮發出推送通知設備在服務器上準備好新數據時。

這將節省設備的電源,節省服務器的負載TON,只有推壓通常需要一秒鐘左右,以供您使用延遲,所以到達也不錯。

唯一需要注意的是,如果用戶拒絕允許推送通知,您還必須實施某種輪詢。但對於他們來說,你可以有很長的輪詢週期,並告訴他們刷新會更快,如果他們啓用推支持...

+0

優秀的建議。當前的實現在最初的概念驗證階段運行良好,但是當我重寫代碼時,我同意這是一條路。 – Chris 2012-07-13 19:08:00

相關問題