0

最初に、私の英語が完璧でない場合は申し訳ありません。私は英語のネイティブではありません ;) !

iCal から EKEvent を取得してアプリに追加するアプリケーションに取り組んでいます。

アプリケーションの目的はカレンダーなので:

ユーザーは、必要なカレンダーから iCal の EKEvent を取得します。

EKEvent は、「イベント」という名前のエンティティに保存されます。

ユーザーはアプリケーションからイベントを編集、追加、削除できます。EKEvent アソシエートは iCal でも変更されます。

問題: ユーザーが iCal で何かを変更する場合、それをアプリケーションに変更する必要があるため、アプリがアクティブになったときに iCal からすべての EKEvent を取得し、「EventBackup」という名前のバックアップ エンティティにコピーする方法しか見つかりませんでした。iCal からのすべての EKEvent が適切に取得され、「EventBackup」エンティティに保存されたら、エンティティをメイン エンティティ「イベント」にコピーします。

私はそれを非同期でうまくやっています

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { });

しかし、私は自分のアプリケーションを使い続けなければなりません - そのため、CoreData から Event * を取得しています - EventBackup を実行している間... CoreData で作業している場合、アプリケーションがクラッシュする問題があります。

その方法を手伝ってくれませんか、それとも私がやっている方法とは違うことを提案してくれませんか。

私を助けてくれてありがとう!

4

2 に答える 2

1

NSManagedObjectContext の performBlock: メソッドを見る必要があります。具体的には、子コンテキストを作成し、バックグラウンド スレッドで変更を加えてから、保存通知をリッスンして親コンテキストにマージする必要があります。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:nil];

NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[childContext setParentContext:self.managedObjectContext];
[childContext performBlock:^{

    //Do everything here...

    NSError *error = nil;
    [context save:&error];
    if (error) {
        NSLog(@"Error saving child context:%@", error.localizedDescription);
    }

 }];

保存する子コンテキストをリッスンしてから、メイン コンテキストを保存します。

 - (void)managedObjectContextDidSave:(NSNotification *)notification
 {
    if ([notification object] != self.managedObjectContext) {
       dispatch_sync(dispatch_get_main_queue(), ^{
         [self.managedObjectContext save:nil];
      });
    }
  }
于 2013-03-12T21:18:32.690 に答える