6

文字列がデータベースに保存されているかどうかを確認する必要があるアプリケーションを開発しています。これは簡単な操作のように思えるかもしれませんが、応答を返すのに 0.5 秒必要です。これはかなり多いと思います。私の質問は、その時間を短縮する方法があるかどうかです。ご関心をお寄せいただきありがとうございます。

これは私の現在のコードです:

- (BOOL) isDeleted:(int)i {

    NSString *value = [NSString stringWithFormat:@"deleted.*.%i", i];

    MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    NSString *entityName = @"Deleted";
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(deletedpics like %@)", value];
    [request setPredicate:pred];

    NSError *error;
    NSArray *objects = [context executeFetchRequest:request error:&error];

    BOOL returnBool = [objects count] >= 1 ? YES : NO;
    return returnBool;

}
4

1 に答える 1

6

最適化の 1 つは、

NSArray *objects = [context executeFetchRequest:request error:&error];

[request setFetchLimit:1];
NSUInteger count = [context countForFetchRequest:request error:&error];

オブジェクトの存在のみを確認したい場合。

しかし、主なパフォーマンスの問題は、 を使用したワイルドカード検索でありLIKE、 を使用した検索よりも遅いと思い==ます。

ステータスと画像番号を(コメントに書いたように)1つの属性に保存する代わりに、別の属性とエンティティdeleted.<status>.<picturenumber>を使用する方がよいでしょう。statuspicturenumber

次に、述語を使用して画像番号を検索できます

[NSPredicate predicateWithFormat:@"picturenumber == %d", i];

これははるかに高速です。必要に応じて、そのプロパティに追加のインデックスを付けることができます (コメントで @flexaddicted が言及されているように)。

于 2013-03-03T23:03:56.613 に答える