web-dev-qa-db-ja.com

Magical Recordを使用してオブジェクトを作成および更新し、contextForCurrentThreadを使用せずにオブジェクトを保存するにはどうすればよいですか。

MagicalRecordのブログ投稿の著者を読んだばかりです MagicalRecordでcontextForCurrentThreadが機能しない理由

contextForCurrentThreadは非推奨であり、代わりにsaveWithBlockを使用する必要があります。これは、関連するスレッドに対して安全な新しいNSManagedObjectContextを作成するためです。

これまで、アプリでcontextForCurrentThreadを幅広く使用してきました。ただし、フェッチと保存が必ずしも順番に行われるとは限らないため、代わりにsaveWithBlockを使用する方法を理解するのに問題があります。

現在、私は次のようなことをしています。

localContext = NSManagedObjectContext.MR_contextForCurrentThread
person = Person.MR_createInContext(localContext)
person.name = "John Smith"

その後、ユーザーはアプリを閲覧でき、さまざまなコントローラー、ビューなどが表示されます。他のオブジェクトは、上記のコードと同様の方法を使用して作成できます。

次に、将来の任意の時点で、ユーザーが保存することを決定したときに、次のメソッドを実行します。

localContext = NSManagedObjectContext.MR_contextForCurrentThread
localContext.MR_saveToPersistentStoreWithCompletion(
  lambda { |success, error|
    # ...
  }
)

オブジェクトを作成および更新してから、contextForCurrentThreadを使用せずに保存するための推奨される方法は何ですか?

10
Paul Sturgess

したがって、RubyMotionではなくObjective Cを使用しますが、次のようなことができるはずです。

MagicalRecord.saveWithBlock(
   lambda { |localContext|
       person = Person.MR_createInContext(localContext)
       #update person stuff here
   }
)

[〜#〜]編集[〜#〜]

後でコンテキストを保存したい場合は、それを保持する必要があります。

// Somewhere in your ViewController, etc
NSManagedObjectContext *context = [NSManagedObjectContext MR_confinementContext];


// Somewhere else
Person *p = [Person MR_createInContext:context];

// And in yet another method
[context MR_saveToPersistentStoreAndWait];

ここでの主なアイデアは、コンテキストを保持し、準備ができたらコンテキストに対して操作を実行する必要があるということです。バックグラウンド保存を実行する場合は、次の方法を使用します。

[context MR_saveToPersistentStoreCompletion:^(BOOL success, NSError *error){
   //called on the main thread when save is complete
}];
8
casademora

ここに新しいAPIのチュートリアルがあります: http://ablfx.com/blog/article/2 ここに参照があります: http://cocoadocs.org/docsets/MagicalRecord/2.1 /

  1. 初期化

    [MagicalRecord setupCoreDataStackWithStoreNamed:@"MyDatabase.sqlite"];

  2. dealloc

    [MagicalRecord cleanUp];

  3. インサート

    Person *alex = [Person MR_createEntity]; alex.name = @"Alex"; alex.age = @23;

  4. 選択する

    / aNSManagedObjectサブクラスのすべてを取得しますNSArray *people = [Person MR_findAll];

    //最初のレコードを取得しますPerson *aPerson = [Person MR_findFirst];

    //条件付きでレコードを取得して並べ替えますNSArray *people = [Person MR_findByAttribute:@"name" withValue:@"alex" andOrderBy:@"age" ascending:YES];

  5. 更新

    //取得したエンティティの更新は、そのプロパティを操作するのと同じくらい簡単ですaPerson.age = @56;

  6. 削除

    //すべてのレコードを削除します[Person MR_truncateAll];

    //単一のレコードを取得した後、削除します[alex MR_deleteEntity];

  7. セーブ

    //エンティティを実際にディスクに保存/更新/削除するには、次のメソッドを呼び出します[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

    //その他の保存オプションについては、MagicalRecordリポジトリをもう一度確認してください

18
lbsweek

ここで誤解されるかもしれませんが、MagicalRecordはこのユースケースに対応していないと思います。 純粋なCoreDataで必要なことを行う方法は次のとおりです。

  1. 独立したコンテキストまたはネストされたコンテキストを作成し、その参照をどこかに(AppDelegate、シングルトンオブジェクトなど)保持します
  2. performBlock: および performBlockAndWait: を使用して、挿入、読み取り、更新、および削除を行います。
  3. 次のコマンドでコンテキストを保存します。

    [context performBlock:^{
        ZAssert([context save:&error], @"Save failed: %@\n%@", [error localizedDescription], [error userInfo]);
    }];
    

これは、この種の問題に対する標準的なアプローチのようです。それはオンラインでうまく説明されています、例えば。 一般的なバックグラウンドプラクティス-バックグラウンドのコアデータ

0
Arek Holko