2012-03-05 6 views
2

私はテーブルビューで無限のスクロールで100万以上のエントリを読み込む必要があるアプリケーションを開発しています。毎回リクエストが1000件分送信され、JSONライブラリを介してデータがダウンロードされて解析されると、テーブルがリロードされます。私はこれを "setFetchBatchSize = 1000"のCoreDataで実装しました。ここでiphoneの膨大な(おそらく1百万のエントリ)データを持つUITableView

StreamModal *modal = [[StreamModal alloc]init]; 
       StreamModal *modal = [NSEntityDescription insertNewObjectForEntityForName:@"StreamModal" inManagedObjectContext:managedObjectContext]; 
       if([self isNotNull:[streamDataDict objectForKey:@"_id"]]) 
        modal.stream_id    = [streamDataDict objectForKey:@"_id"]; 

-(void)reloaData{ 
@try { 
    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Update to handle the error appropriately. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    } 
    NSLog(@"ferchresults count %d",[[_fetchedResultsController fetchedObjects]count]); 
} 
@catch (NSException *exception) { 
    NSLog(@"exception raised in reloadData in streamViewController class %@",exception); 
} 
@finally { 

} 
} 


- (NSFetchedResultsController *)fetchedResultsController { 

if (_fetchedResultsController != nil) { 
    return _fetchedResultsController; 
} 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"StreamModal" inManagedObjectContext:appDelegate.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

[fetchRequest setFetchBatchSize:1000]; 
//[fetchRequest setFetchLimit:2000]; 

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
self.fetchedResultsController = theFetchedResultsController; 
_fetchedResultsController.delegate = self; 

fetchRequest = nil; 
theFetchedResultsController = nil; 

return _fetchedResultsController;  

} 

は私が今までのデータをconnectionfinishedloadingときに私はNSManagedObjectクラス(StreamModal)にデータを移入していますし、私は12000をロードした後、問題がアプリはメモリの例外を取得しているされてdata.Hereリロードを呼び出して、使用していたコードですテーブルのエントリとクラッシュする私はどのようにメモリ例外なしですべてのエントリを読み込むことができます。私はCoreDataの概念が新しく、開発者ガイドを通じてコアデータの概念を読みましたが、メモリ処理に関する情報は見つかりませんでした。私を助けてください。

+5

iPhoneの画面で親指で100万行をスクロールするのにどれくらいの時間がかかりますか?これはばかげているようだ。 – jrturton

+0

OMG。クライアントは誰ですか?私は彼/彼女に会いたいですか? 100万エントリ? –

+0

私の知る限り、ユーザーがスクロールするたびに、または他のイベントのためにデータの部分をダウンロードする方が良いと言えます。そうしないと、デバイスのメモリが制限され、一度に多くのデータを読み込むことができなくなります。 –

答えて

1

あなたはARCを使用していますか?初期化されたオブジェクトを解放していないからです。 (これがあなたの答えでない場合)

しかし、とにかく:どのオブジェクトがメモリフットプリントを最大限に増やしているかを見るためにInstrumentsを使用しようとしましたか?それは良い出発点です。

+0

ありがとうございましたiaydee3、はい私は楽器でチェックして、私はライブバイトが15から17MBの間で5000エントリ(毎回1000だけ)をダウンロードし、ページ数が増えるにつれてメモリサイズも増えていることがわかりました1000エントリだけをダウンロードし、coredataを使用して保存します)、テーブルのダウンロードと再ロードが完了すると、ライブバイトは3.0MBに戻っています。ライブバイトが増え続ける理由を理解できません。私は12000エントリのテーブルを再読み込みしている可能性があると思っていました。 –

+0

はい私はARCを使用しています。 –

0

シヴァのinturi、

まず、私は百万項目の単一のテーブルビューでの作業は本当に悪いユーザーエクスペリエンスであることを他のコメントをエコーし​​ます。

ご質問に:

メモリの警告が来たらどうしますか?

少なくとも、オブジェクト配列を通過し、オブジェクトグラフをトリムする必要があります。これは-refreshObject:mergeChanges:で行われます。あなたはまたあなたの配列を非常に遠くに横切らないように注意しなければなりません。あなたの目に見えるオブジェクトから始め、フォールバックされたオブジェクトにヒットするまでは、-isFaultでテストすることで、前後に働きます。

アンドリュー

関連する問題