3

アプリへのデータベースを管理するために Core Data を使用しています。

コードが長すぎるため、ここに投稿することはできません。しかし、いくつかのスナップショットと一緒に小さなコード行で私の問題を説明できると思います。

+(NSArray *)checkusernameandpassword:(NSString *)entityname  username:(NSString *)username   password:(NSString *)password 
{
    managedobjectcontext=[Singleton sharedmysingleton].managedobjectcontext;
    NSEntityDescription *entity=[NSEntityDescription entityForName:entityname inManagedObjectContext:managedobjectcontext];

    NSFetchRequest *request=[[NSFetchRequest alloc] init];
    [request setEntity:entity];

    NSPredicate *predicates=[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"userName==\"%@\" AND password==\"%@\"",username,password]];
    [request setPredicate:predicates];  
    //On Below line, My app frezes and goes into deadlock, this happens randomly while performing
    //some data request using Core data
    NSArray *arrayofrecord=[managedobjectcontext executeFetchRequest:request error:nil];    

    return arrayofrecord;
}

呼び出しスタックのスクリーン ショットをいくつか添付しようとしています (これらはアプリを一時停止したときに表示 されます)。 デッドロックが発生する画像のチェックマークの方法は上記

4

3 に答える 3

3

スレッドをロックする必要があります。この問題は、複数のスレッドが同じコードにアクセスする場合に発生します。しかし、デッドロックに陥ってはいけません。

static NSString *fetchRequest = @"fetchRequest";
    NSArray *results;
    @synchronized (fetchRequest){
        managedobjectcontext=[Singleton sharedmysingleton].managedobjectcontext;
        NSEntityDescription *entity=[NSEntityDescription entityForName:entityname inManagedObjectContext:managedobjectcontext];

        NSFetchRequest *request=[[NSFetchRequest alloc] init];
       [request setEntity:entity];

       NSPredicate *predicates=[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"userName==\"%@\" AND password==\"%@\"",username,password]];
       [request setPredicate:predicates];  
       //On Below line, My app frezes and goes into deadlock, this happens randomly while performing
       //some data request using Core data
       results = [managedobjectcontext executeFetchRequest:request error:nil];    
}
return results;
于 2012-07-24T14:31:35.997 に答える
-1

[private performBlock:^{}];マルチスレッド環境で Core Data を使用する場合に試すことができます。

詳細については、このドキュメントを確認してください https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html#//apple_ref/doc/uid/TP40001075-CH24-SW1

于 2018-01-26T08:39:01.330 に答える