2

コアデータが実際にどのように機能するかについて明確に理解していません。これは私が直面している結果かもしれません。アプリケーションを介して単一のmanagedObjectContextを使用するアプリケーションがあります。私は、managedObjectContextがその中のすべてのmanagedObjectを保持し、コンテキストをリセットするまで、オブジェクトは常にコンテキスト自体によって保持されることを知っています。したがって、私が行うことは、ユーザーデータなどのメインオブジェクトをフェッチしてから、ViewController全体に同じオブジェクトを渡し続けることです。何らかの変更が発生した場合、オブジェクトは他のコードによって更新されます。これはほとんどすべての場合にうまく機能します。

しかし、私はどのビューコントローラでもオブジェクトへの強力なポインタを保持していません。オブジェクト自体がmanagedObjectContextプールによって保持されるため、弱参照を保持します。ただし、リモートに同期してオブジェクトを更新すると、この戦略に問題が発生することがあります。私の弱いポインタは役に立たなくなります。データはありません。すべての属性が空になります。ログに記録するとすべての属性名が表示されますが、値はnilです。オブジェクトが常に更新され、メインコンテキストと同期していることを確認するにはどうすればよいですか?この方法でmanagedObjectへの弱いポインタを維持するのは悪い考えですか。私はそれをどのビューコントローラーにも保持しないと思います。すべてのViewControllerは弱いポインタを使用します。

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

ルートビューコントローラーでデータをフェッチし、

-(void)tableView:(UITableView*)tv didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
  User *user = [self.fetchedResultsController objectAtIndexPath:indexPath];
  FirstViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"firstViewController"];
  firstViewController.user = user;
}

FirstViewController:

@interface FirstViewController:UIViewController
  @property(nonatomic, weak) User *user
@end

私はここでオブジェクトを使って多くのことを行いますが、その間に、rootViewControllerからオブジェクトを更新する可能性があります。ただし、同じオブジェクトであるため、ほとんどの場合更新されているように見えます。

次に、最初のビューコントローラで再び;

-(void)tableView:(UITableView*)tv didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
  User *user = [self.fetchedResultsController objectAtIndexPath:indexPath];
  SecondViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"];
}

SecondViewController

@interface SecondViewController:UIViewController
  @property(nonatomic, weak) User *user
@end

ここでも、オブジェクトは弱く参照されています。私はオブジェクトで多くのことをします、または他のいくつかのビューコントローラはリモートから同期するかもしれませんが、それは更新し続けます。このオブジェクトは、最後のView Controllerまで深い階層に渡され、それらのViewControllerはすべてオブジェクトへの弱いポインターを保持します。

ほとんどの場合、それは非常に問題ありません。しかし、現在のView Controllerでは、オブジェクトがネットワークに同期されている場合でも、nullのように見えることがよくあります。つまり、オブジェクトにはすべてのプロパティの説明が含まれていますが、値は含まれていません。しかし、しばらくすると突然現れます。

何が起こったのか。オブジェクトをルートコンテキストに同期させ、変更が発生したときに更新するにはどうすればよいですか?強力な指針を維持することで、これで私のすべての問題を解決できるでしょうか。オブジェクトに障害が発生していないことが原因である可能性があります。オブジェクトの1つでオブジェクトを排他的にフォールトして、他のすべてのオブジェクトから見えるようにするにはどうすればよいですか。

本当にあなたの助けと配慮をいただければ幸いです。私は英語が下手かもしれませんが、誰かが私の質問を理解し、それをより良い方法で表現できれば、私もそれを本当に嬉しく思います。:)

4

1 に答える 1

1

オブジェクトを更新しても生き残る必要がある場合は、弱く保持しないでください。強く保持してください。refreshObject:次に、コンテキストが更新された後にそれを呼び出すことができます。または、アクセサーで遅延フェッチを使用して、オブジェクトにアクセスし、それが nil の場合に再度フェッチを行うようにします。

以下も参照してください。

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/Articles/cdTroubleshooting.html

于 2013-02-15T19:02:27.323 に答える