2015-07-13 168 views
1

我正在創建一個遊戲,它由不同的遊戲板組成,這些遊戲板以字典形式存儲在數組中,存儲在json文件中。 json文件非常大,數組中有超過3000個對象,大小約爲23mb。 ,我目前加載該文件的方法是在的appDelegate實現文件像這樣didFinishLaunchingWithOptions:在應用程序啓動時打開大兒子文件,迫使開始時間很長

NSString * filePath =[[NSBundle mainBundle] pathForResource:@"words" ofType:@"json"]; 

NSError * error; 
NSString* fileContents =[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; 


if(error) 
{ 
    NSLog(@"Error reading file: %@",error.localizedDescription); 
} 


NSDictionary *data = (NSDictionary *)[NSJSONSerialization 
             JSONObjectWithData:[fileContents dataUsingEncoding:NSUTF8StringEncoding] 
             options:0 error:NULL]; 

wordsArray = [[NSMutableArray alloc]initWithArray:[data objectForKey:@"results"]]; 

然後我可以檢索從應用的任何數組致電:

NSArray *wordsArray = appDelegate.wordsArray; 

除了應用程序花費15秒以上加載iPhone 4設備的時間太長以及我瞭解應用程序可能因爲加載時間過長而被拒絕這一事實,它的效果很好。

有人建議可以有更好的方式去了解這一點,

感謝

+1

使用中間的屏幕,看起來像飛濺或加載屏幕,並做好了那裏。對於任何主要任務,您應該避免使用'didFinishLaunchingWithOptions' –

+2

您應該在後臺線程中使用GCD或NSOperation執行較長的任務,以免阻塞UI線程。谷歌「iOS導入大型數據集」。還要看看Core Data以避免在每次應用程序啓動時導入數據。 – ryancrunchi

+0

將各個遊戲板放在不同的文件中。另外JSON實際上不是很好的存儲格式,它實際上是一種傳輸格式。 – zaph

回答

1

正如Yedidya所建議的,您可能想要展示一些有趣的內容以保持用戶參與。

最重要的是,最重要的是:

  • 保持你的UI響應
  • 做文件/網絡資源的加載在後臺線程。有充足的代碼示例顯示相同。使用performselectorOnBackgrounddispatch_async(some_global_queue)之一執行後臺任務。
  • 完成後,使用performselectorOnMainThreaddispatch_asynch(dispatch_get_main_queue)回到主屏幕/遊戲界面。

這裏的要點是:

//START BUSY CURSOR HERE 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
    ^{ 
     // Read JSON file here 
     dispatch_async(dispatch_get_main_queue(), 
     ^{ 
     //STOP BUSY CURSOR 
     //PERFORM UI UPDATE HERE 
    }); 
+0

好,我試圖在appDelegate之外加載文件,但是UI會凍結,所以爲什麼我如果首先將它添加到代表中,我會採取簡單的選擇,我現在就給它一個 – Shayno

+0

蘋果推薦的方式是不要在didfinishlaunching裏面做任何沉重的東西。您只需要將事物派生到全局隊列中,然後使用數據將您的UI加載到主隊列中。同時,顯示空視圖控制器沒有問題 - 使用您首選的忙光標或動畫。您可以在「START BUSY CURSOR」區域開始所有操作。 –

+0

感謝您的幫助,作品魅力無窮! – Shayno

2

設置與裝載機的輸入屏幕(做用戶...一個有趣的裝載機),並在此屏幕上加載數據。完成後,啓動您的遊戲...

+0

應用程序仍在加載15秒以上的事實仍然會影響我獲得批准的可能性嗎? – Shayno

+0

嗨,應用程序將拒絕或崩潰,​​如果應用程序不加載在足夠短的時間。 - https://developer.apple.com/library/ios/qa/qa1592/_index.html 。如果你要在新的屏幕上加載數據,這應該不成問題。 儘管如果你只是在長時間加載時顯示靜態屏幕,蘋果可能會因爲用戶體驗問題而拒絕它... – Yedidya

3

使用類似核心數據的東西。它被設計用於存儲這樣的信息。

此外,不要把它放在APP代理!應用程序代表可以響應應用程序事件。這不是您應用程序需要的所有數據的轉儲。

2

正如Yedidya所建議的,您可能想要展示一些有趣的內容以保持用戶參與。

最重要的是,最重要的是:

  • 保持你的UI響應
  • 做文件/網絡資源的加載在後臺線程。有充足的代碼示例顯示相同。使用performselectorOnBackgrounddispatch_async(some_global_queue)之一執行後臺任務。
  • 完成後,使用performselectorOnMainThreaddispatch_asynch(dispatch_get_main_queue)回到主屏幕/遊戲界面。
1

蘋果也有很多指南,以幫助您:

通常,性能是應用程序設計的產物,因此爲了提高性能,您可能必須重新設計應用程序的大部分內容。

我會按照下列步驟操作:

  1. 測量CPU使用率和Instruments user Guide磁盤訪問。
  2. 不加載和解析主線程上的這樣一個大文件。
  3. 儘可能分割文件。
  4. 如果應用程序中未發生任何事情,則預加載資源。
相關問題