1

ワークフローのルートであるコントローラーがあります。ワークフローのデータ オブジェクトがない場合は、新しいオブジェクトを作成し、存在する場合は既存のものを使用します。モデル オブジェクト (NSManagedObject) のプロパティがあります。

@property (nonatomic, retain) Round *currentRound;

対応するビューが表示されるたびに、次を呼び出します

self.currentRound = [self.service findActiveRound];
if (!self.currentRound) {
    NSLog((@"configure for new round"));
    self.currentRound = [self.service createNewRound];
    ...
} else {
    NSLog(@"configure for continue");
    // bad data here        
}

問題は上記でマークされた場所にあり、データ オブジェクトが破損している場合があります。表示されていない部分では、いくつかのテキスト フィールドに値を設定して、モデルの値を表しています。場合によっては問題ありませんが、最終的にはモデル オブジェクトのプロパティが空になり、問題が発生します。

デバッガーでは、ラウンドへの参照は変更されないように見えますが、関連するプロパティを NSLogging すると、それらが無効になっていることが示されます。デバッグは、破損の開始を遅らせるようです。

コンテキストを保存していないことは承知しています...それは問題ですか?もしそうなら、なぜこのコントローラーに初めて戻ったときに常に失敗するとは限らないのですか?

私の findActiveRound メッセージは特別なものではありませんが、重要な場合に備えて

-(Round *) findActiveRound
{
    NSLog(@"Create Active Round");
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Round" inManagedObjectContext:context];
    [request setEntity:entity];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"isComplete == %@", [NSNumber numberWithBool:NO]];
    [request setPredicate:pred];

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

    if ([results count] == 0) {
        return nil;
    } else {
        return [results objectAtIndex:0];
    }
}

多くの感謝。

応答のために編集

破損とは、モデル オブジェクトからいくつかの単純な文字列プロパティを取得しようとすると、値が nil になることを意味します。したがって、上記のコード(ラウンドがあると思われる場所)では、次のようなことを行います

self.roundName.text = self.currentRound.venue;
self.teeSelection.text = self.currentRound.tees;

入力したデータが表示されません。時々失敗するだけで、最終的には常に失敗するため、入力したデータが消える前にしばらく表示されます。

文脈は同じだと思います。私のサービスはシングルトンであり、そのように作成されました

@implementation HscService

+(id) getInstance
{
    static HscService *singleton = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        singleton = [[self alloc] init];
    });
    return singleton;
}

-(id) init
{
    if (self = [super init]) {
        model = [NSManagedObjectModel mergedModelFromBundles:nil];
        NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

        NSString *path = [self itemArchivePath];
        NSURL *storeUrl = [NSURL fileURLWithPath:path];

        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSNumber numberWithBool:YES],
                                 NSMigratePersistentStoresAutomaticallyOption,
                                 [NSNumber numberWithBool:YES],
                                 NSInferMappingModelAutomaticallyOption, nil];

        NSError *error = nil;
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
            [NSException raise:@"Open failed" format: @"Reason: %@", [error localizedDescription]];
        }

        context = [[NSManagedObjectContext alloc] init];
        [context setPersistentStoreCoordinator:psc];
        [context setUndoManager:nil];
    }
    return self;
}

-(NSString *) itemArchivePath
{
    NSArray *docDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *dir = [docDirectories objectAtIndex:0];
    return [dir stringByAppendingPathComponent:@"hsc1.data"];
}

すべてのコントローラーで、操作を実行するシングルトンを取得します。ラウンド操作に関するデリゲートを定義し、それを AppDelegate に実装する予定なので、アプリでサービスを取得するのは 1 回だけですが、今のところ問題になるとは思いません....

4

1 に答える 1

1

データが実際に破損していると確信していますか? マネージド オブジェクト コンテキストは非常に効率的であり、デバッガーでエラーが発生するのは正常です。ドキュメントから:

「フォールトは、Core Data がアプリケーションのメモリ使用量を削減するために採用するメカニズムです...」

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.htmlを参照してください。

データが実際に欠落しており、他の方法でアクセスできない場合は、同じ管理対象オブジェクト コンテキストを使用してデータにアクセスしていることを確認してください。データがデータ ストアにコミットされていない場合、MOC 間で「同期」されません。

于 2013-02-23T02:37:25.553 に答える