2012-03-23 15 views
0

我正在使用我應用程序的didFinishLaunchingWithOptions中的函數來檢索文件,並將其保存到應用程序目錄。檢索遠程文件時,防止由於連接速度緩慢導致應用程序崩潰

我發現當發生這種情況時,應用程序會發生崩潰。我讀到蘋果允許在應用崩潰之前允許20秒的時間限制。它是否正確?如果是這樣,我相信這是我的問題,因爲應用程序完美無缺,除了處於非常薄弱的​​連接之外。

我如何修改我的邏輯以嘗試彌補這一點?

- (void)writeJsonToFile 
{ 
//applications Documents dirctory path 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

//live json data url 
NSString *stringURL = @"http://link-to-my-data.json"; 
NSURL *url = [NSURL URLWithString:stringURL]; 
NSData *urlData = [NSData dataWithContentsOfURL:url]; 

//attempt to download live data 
if (urlData) 
{ 
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"]; 
    [urlData writeToFile:filePath atomically:YES]; 
} 
//copy data from initial package into the applications Documents folder 
else 
{ 
    //file to write to 
    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"]; 

    //file to copy from 
    NSString *json = [ [NSBundle mainBundle] pathForResource:@"data" ofType:@"json" inDirectory:@"html/data" ]; 
    NSData *jsonData = [NSData dataWithContentsOfFile:json options:kNilOptions error:nil]; 

    //write file to device 
    [jsonData writeToFile:filePath atomically:YES]; 
} 

}

回答

5

這是一個非常糟糕的主意來運行這一類的主線程的事情:我猜你是 - 基本上,你會阻止整個UI,而你等待網絡操作完成。

dataWithContentsOfURL對於這類事情不是一個好主意。使用NSURLConnection或者其中一個包裝庫如AFNetworking會更好,因爲您可以處理像連接超時的情況。

這些庫還具有內置方法來異步下載數據,這可以防止主UI線程被鎖定。

+0

感謝您指出我的線程使用中的缺陷。這是我的第一個應用程序,所以我仍然適應線程和內存管理的概念。在重新思考當前這種方法的實現之後,我打算在應用程序啓動後更新後臺數據。您的回答與@SVGreg類似,但您首先提出了建議,以便在此處給出答案。 – 2012-03-23 14:47:09

1

下載的數據何時需要?

根據答案,也許你可以調用線程內的方法。這將防止主線程阻塞。

即使從頭開始需要數據,您也可以創建一個加載程序並在後臺下載文件,然後在下載文件後使應用程序處於活動狀態。

+0

我的應用程序需要數據存在才能運行。我使用捆綁包中數據文件的本地副本傳送應用程序,以便在第一次運行時使用本地數據,然後在後臺檢索任何更新。這似乎是最好的方法,因爲在等待新數據時,我不必將應用程序置於非活動狀態。 – 2012-03-23 14:36:25

+0

這聽起來是一個很好的解決方案。但仍然需要重新考慮哪些是最好的方式來下載該文件爲lxt和SVGreg寫道。另一種解決方案是使用ASIHTTPRequest,但是這可能太過於壓倒性的下載一個我認爲不會很大的文件。 – o15a3d4l11s2 2012-03-23 14:45:12

1

我認爲要更加獨立於NSData *urlData = [NSData dataWithContentsOfURL:url];的內部實施,您應該根據NSURLConnection實施您自己的下載課程。

的鏈接閱讀:

URL Loading System Programming Guide

NSURLConnection Class Reference

NSURLConnectionDelegate Protocol Reference

所以,你可以通過你的代碼捕獲所有的連接錯誤和執行在這種情況下正確的行爲。

+0

對於建議和支持鏈接。我將評估並確定這是否是我想繼續使用的路線。 – 2012-03-23 14:34:13

相關問題