2

これが管理対象オブジェクトコンテキストを共有するための悪いアイデアであるかどうかについての少しのフィードバックを探しているだけです。

私が追加したMyApp-Prefix.pchファイルには、次のものがあります。

#import "AppDelegate.h"
#define MOC [(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]

次に、コンテキストにアクセスする必要がある場合は、次のようにします(単なる例)。

[MOC deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

これはうまくいくようですが、特にどこにも言及されていないので、簡単すぎるようです。これは悪いデザインパターンですか?

フィードバックをありがとう

4

2 に答える 2

2

コンパイラマクロの代わりに(これは時々驚きを引き起こす可能性があります)、私は通常、次のようにアプリデリゲートでクラスメソッドを定義します。

+ (AppDelegate *)sharedDelegate
{
    return [[UIApplication sharedApplication] delegate];
}

次に、グローバル状態への参照が必要な場合は、次のように呼び出すことができます。

[[[AppDelegate sharedDelegate] managedObjectContext] deleteObject:foo];

アプリが十分に複雑な場合は、グローバルコンテキストを使用するのではなく、管理対象オブジェクトコンテキストへの参照を渡すのに苦労する価値があるかもしれません。そうすると、変更をグループ化するための子コンテキストなど、後でリファクタリングして他の手法を使用することが容易になります。

具体的には、各ビューコントローラが独自のmanagedObjectContextインスタンス変数を持っていることを意味します。新しいViewControllerを提示するときは、参照を渡します。おそらく、カスタムinitメソッドで、おそらくプロパティを設定することによって。どのクラス(ルートビューコントローラーを除く)も、グローバルアプリデリゲートを参照しません。このように、複雑な編集ビューがある場合は、変更を「一時的に」保存できる子コンテキストを指定できます(すべてのオブジェクトが有効であることを確認するため)。ユーザーがキャンセルボタンを押すと、コンテキスト全体が破棄されます。

また、常にグローバルコンテキストを使用している場合は、追跡が難しいバグがある可能性があります。たとえば、編集ビュー自体がクリーンアップされない場合、無効なオブジェクトが残ります。次に、無関係なものを保存しようとすると、エラーが発生します。私に起こった、デバッグするのは面白くありませんでした。

于 2012-06-06T22:25:31.787 に答える
0

このアプローチに問題はありませんが、プログラムの存続期間中にデリゲートの管理対象オブジェクトコンテキストが変更されない限り、グローバル変数を使用する方が賢明で効率的です。Cocoa AppKitフレームワークは、に設定されているNSApp変数を使用して2番目のアプローチを取ります[NSApplication sharedApplication]

于 2012-06-06T22:24:06.623 に答える