3

私はこの問題に対して考えられるすべての可能な解決策を試すために何日も費やしましたが、何も機能していないようです。

私は次のようなバックグラウンドスレッドを実行します:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {

                    Media *localMedia = [media inContext:localContext];

                    UIImage *image = localMedia.thumbnail;


                    dispatch_async(dispatch_get_main_queue(), ^{

                        [thumbnails setObject:image forKey:[NSNumber numberWithInt:i]];
                        [contentDict setObject:thumbnails forKey:@"MediaItems"];
                        [cell.entryView setNeedsDisplay];
                    });

                }];

またはこのように:

dispatch_queue_t cellSetupQueue = dispatch_queue_create("com.Journalized.SetupTimelineThumbnails", NULL);
            dispatch_async(cellSetupQueue, ^{

                NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];
                NSPersistentStoreCoordinator *coordinator = [NSManagedObjectContext contextForCurrentThread].persistentStoreCoordinator;
                [newMoc setPersistentStoreCoordinator:coordinator];

                NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
                [notify addObserver:self
                           selector:@selector(mergeChanges:)
                               name:NSManagedObjectContextDidSaveNotification
                             object:newMoc];

Media *localMedia = [media inContext:[NSManagedObjectContext contextForCurrentThread];

                        UIImage *image = localMedia.thumbnail;


                        dispatch_async(dispatch_get_main_queue(), ^{

                            [thumbnails setObject:image forKey:[NSNumber numberWithInt:i]];
                            [contentDict setObject:thumbnails forKey:@"MediaItems"];
                            [cell.entryView setNeedsDisplay];
                        });

                    }];

これらは両方とも、UIImageがnilオブジェクトとして返され、Cocoa Error 133000

念のため、バックグラウンドスレッドコードを1つおきに削除し、その直前にメインスレッドに保存しました。上記のコードをメインスレッドで実行することもできますが、UIがフリーズします。これらすべての努力にもかかわらず、上記のコードは毎回クラッシュします。

これを機能させるために何をすべきかわかりません。

編集:

私の質問は、具体的には、クラッシュせずにこれを機能させるにはどうすればよいですか?あるコンテキストのオブジェクトが別のコンテキストに存在しないという問題のようですが、どうすればそれらを別のコンテキストに存在させることができますか?

4

2 に答える 2

2

MR_inContext: メソッドは、内部で [NSManagedObjectContext objectWithID: ] メソッドを使用していることを思い出してください。そこを調べて、オブジェクトに次のものがあることを確認する必要があります。

1) 最初のコード ブロックでバックグラウンド コンテキスト/ブロックに入る前に保存されている 2) このメソッドは何か役に立つものを返している

また、サムネイル属性の設定方法もわかりません。理想的には、NSTransformable コードを記述している限り問題にならないはずです (transformable 属性を使用して UIImage をコア データに保存する方法を示すサンプルがインターネット上にあります)。

また、コードは次のようになります。

UIImage *image = nil;
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {

  Media *localMedia = [media inContext:localContext]; //remember, this looks up an existing object. If your context is a child of a parent context that has contains this, the localContext should refresh the object from the parent.

  //image processing/etc

  image = localMedia.thumbnail;

} completion:^{              

    [thumbnails setObject:image forKey:@(i)]; //new literals are teh awesome
    contentInfo[@"MediaItems"] = thumbnails;  //as is the new indexer syntax (on the latest compiler)

    [cell.entryView setNeedsDisplay];

}];
于 2012-08-03T15:52:46.427 に答える
1

素早い答え:

NSManagedObjectReferentialIntegrityError = 133000, // 存在しないオブジェクトを指している障害を発生させようとします (ストアは見えますが、オブジェクトは見えません)

編集:コードから何かを見るのはかなり難しいです。そこでの管理対象物とは?

問題は、あるコンテキストの一時オブジェクトを別のコンテキストで使用していることだと思います。

于 2012-08-03T13:38:10.040 に答える