1

おはよう。

デバイスでアプリを実行すると問題が発生します。メインの tableView をスクロールすると、遅れたり途切れたりします。

tableCell内からのコアデータへの呼び出しに問題を絞り込みました

-- indexPath の行のセルで person はカスタム クラスであり、contact manager はコア データへのすべての呼び出しとデータの操作を含む私のファイルです。

    person.contactSelected = [contactManager checkContactSelectedStatus:person];

-- 私の contactManager ファイルでは、呼び出しはこの関数に行きます。

連絡先の選択済みステータスを更新するだけです(ユーザーがボタンを押して、通話で許可されているかどうかを変更したとき)

-(NSNumber *) checkContactSelectedStatus:(ContactPerson *)person{

SWNAppDelegate *delegate = [[UIApplication sharedApplication]delegate];

NSManagedObjectContext *context = [delegate managedObjectContext];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:context];

NSFetchRequest *req =[[NSFetchRequest alloc]init];

[req setEntity:entity];

NSPredicate *pred =[NSPredicate predicateWithFormat:@"(recordID like %@)",[person.recordID stringValue]];

[req setPredicate:pred];

NSError *error;

NSManagedObject *checkStatus = [[context executeFetchRequest:req error:&error] objectAtIndex:0];

person.contactSelected = [checkStatus valueForKey:@"isSelected"];

return person.contactSelected;}

これをキューに入れる簡単な方法はありますか? NSManagedObject をキューに送信する方法を読んで理解しようとしましたが、親 MoC の子を作成すると、エンティティ「連絡先」が見つかりません。もっと簡単な方法があるかどうかはわかりません!?

お時間をいただきありがとうございます。WhatWasIThinking!?!?!

4

1 に答える 1

0

はい、これは本当に非効率なコードです。フェッチは複数回、つまり各セルが表示されるたびに実行する必要があります。

NSFetchedResultsController代わりに、テーブル ビューで動作するように特別に設計された を使用する必要があります。フェッチのためにストアに移動する適切な回数を決定し、速度とメモリ フットプリントを最適化します。

また、ほとんどの場合、使用するコードが大幅に少なくなります。

その上、述語文字列 likerecordID like %@はあまり意味がありません。ID を使用している場合は、ID を一意にする必要があるため、インデックスを作成して非常に高速に検索できます。LIKEのような文字列関数CONTAINSが比較す​​ると非常に遅いのと同じです。

于 2012-12-08T12:16:07.187 に答える