2011-03-09 90 views
0

我正在開發一個應用程序,它從位於我的web服務器上的plist檢索其數據。因此,該應用程序依賴於網絡連接。我希望用戶能夠在離線時使用我的應用程序,因此每次應用程序加載網絡連接時,我都會在用戶設備上保存plist的副本。從那裏,我讀取了位於設備上的plist的數據。從未保存的plist中讀取

雖然我有麻煩。我開始下載AppDelegate的didFinishLaunchingWithOptions方法中的數據。這是這樣完成的:

if(hasConnection) { // returns TRUE or FALSE based on Apple's example on checking network reachability 
     NSLog(@"Starting download of data."); 

     // loading using NSURLConnection 
     NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:FETCH_URL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 

     // create the connection with the request 
     // and start loading the data 
     NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
     if (theConnection) { 
      // Create the NSMutableData to hold the received data. 
      // receivedData is an instance variable declared elsewhere. 
      receivedData = [[NSMutableData data] retain]; 
     } 
    } 

然後我connectionDidFinishLoading

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // throw data into a property list (plist) 
    NSMutableArray *tmpArray = [NSPropertyListSerialization propertyListFromData:receivedData mutabilityOption:NSPropertyListMutableContainers format:nil errorDescription:nil]; 

    NSMutableArray *plistArray = [[NSMutableArray alloc] initWithArray:tmpArray]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Bands.plist"]; 

    [plistArray writeToFile:path atomically:YES]; 
    [plistArray release]; 

    // release the connection, and the data object 
    [connection release]; 
    [receivedData release]; 
} 

將數據添加到我的plist Bands.plist但加載首次應用程序時,它崩潰。我相信這是由於應用程序嘗試訪問這些數據,即使它尚未保存。如果我刪除試圖訪問保存在本地的數據的部分,我沒有問題。如果我再次添加並重新啓動應用程序(第二次加載),我也沒有問題。

有沒有人有一個想法如何解決這個問題?

這就好像我的應用程序試圖加載和處理尚不存在的數據。

+0

什麼做控制檯和調試器告訴你 - 你應該能夠找出哪一行崩潰。 – deanWombourne 2011-03-09 20:38:50

+0

@deanWombourne我得到了'NSInvalidArgumentException',原因:' - [__ NSCFDictionary setObject:forKey:]:嘗試插入nil值,我相信這是由於該方法試圖處理它沒有的信息。有沒有辦法讓它等待plist準備好? – simonbs 2011-03-09 20:41:30

+0

爲什麼不附帶默認plist,其中包含足夠的應用程序啓動。那麼應用程序可以在顯示請稍候或其他類似內容時在後臺啓動獲取更多數據? (或者你可以試試@ Mundi的想法!) – deanWombourne 2011-03-09 21:39:40

回答

0

簡單地嘗試檢查plist中第一個的存在:

if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { 
    ... // read the data, etc. 
} 
else { 
    ... // don't try to read it 
} 

乾杯,
薩沙

+0

非常感謝。如果一個虛擬文件尚不存在,則複製一個虛擬文件似乎可以解決問題。 – simonbs 2011-03-10 14:56:22