1

私はこれを検索しましたが、答えは単純すぎて満足できません:(

アプリ内のほぼすべてのビュー コントローラーにNSManagedObjectContextfromを渡したい。TabBarController詳細には、私のストーリーボード構造は次のようなものです。

TabBarController>>> 複数のタブ アイテム ビュー (これは簡単に渡すことができます。ビュー コントローラーに合わせて 1 回渡すだけです)。しかし、私は別の関係を持っています: TabBarController(上記のもの) >>> NavigationController>>> TableViewControllerOne>>> TableViewControllerTwo,

今は災害です。基本的に、NSManagedObjectContextインスタンスをNavigationControllertoTableViewControllerOneとto に転送する必要があるため、これTableViewControllerTwoには多くのことが含まれる可能性があり、prepareSegue:sender管理が容易ではありません。

私の質問は、iOS 開発において、アプリ全体で簡単にアクセスできる「グローバル」オブジェクトを作成する方法はありますか? コア データを使用したマスター/詳細ビューの Apple の公式テンプレートからNSManagedObjectContext、アプリ内デリゲートをインスタンス化し、それをマスター ビュー コントローラーに渡します。複数のビュー パスの後でこのオブジェクトを使用する必要がある場合はどうすればよいですか? うわー、それはやるべきコードがたくさんあります。

私が自分自身を明確にし、誰かが助けてくれることを願っています:)どうもありがとう。

4

3 に答える 3

2

CoreData スタックの要件に合わせてMagicalRecordライブラリを使用することを強くお勧めします。

次に、次のようなことができます。

[NSManagedObjectContext MR_defaultContext];

また

[NSManagedObjectContext MR_contextForCurrentThread];

また、最初に CoreData をセットアップするのは、次のように簡単です。

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"myDatabase.sqlite"];

于 2013-05-16T13:30:23.550 に答える
1

個人的には、ModelControllerコア データ スタック関連のオブジェクト (コンテキスト、モデル、ストア コーディネーター) とヘルパー メソッドをすべて 1 か所に配置できるクラスのシングルトン オブジェクトを使用して、ビュー コントローラーのどこからでもアクセスできるようにするのが好きです。このようなもの:

@implementation ModelController

- (NSManagedObjectModel *)managedObjectModel
{
    // ...
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    // ...
    return _persistentStoreCoordinator;
}

- (NSManagedObjectContext *)contextForCurrentThread
{
    NSManagedObjectContext *context = [[NSThread currentThread] threadDictionary][@"threadManagedObjectContext"];
    if (context == nil)
    {
        context = [[NSManagedObjectContext alloc] init];
        [context setPersistentStoreCoordinator:self.persistentStoreCoordinator];

        [[NSThread currentThread] threadDictionary][@"threadManagedObjectContext"] = context;
    }
    return context;
}

- (void)resetCoreDataStack
{
    [[[NSThread currentThread] threadDictionary] removeObjectForKey:@"threadManagedObjectContext"];
    self.persistentStoreCoordinator = nil;
    self.managedObjectModel = nil;
}

+ (ModelController *)sharedModelController
{        
    static ModelController *modelController;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        modelController = [[ModelController alloc] init];
    });
    return modelController;
}
@end
于 2013-05-16T13:37:23.000 に答える
1

シングルトンを作成する次の共有ストアのアイデアを使用します。これは、さまざまなものをグローバルに保存するのにかなり柔軟でした(コードは iOS Programming The Big Nerd Ranch Guide から適応されています)。

以下のコードには、常に同じ PartStore インスタンスを返す PartStore クラスがあります。

このインスタンスにアクセスするには、共有ストアへのアクセスが必要なクラスに PartStore.h を含め、クラス メソッドを使用してインスタンスを取得します。

[PartStore sharedStore];

その後、そのクラスのインスタンスに含まれる任意のプロパティにアクセスできます。

// PartStore.h
#import "PartData.h"

@interface PartStore : NSObject

@property (nonatomic, strong) PartData *scannedData;

+ (PartStore *)sharedStore;

@end

// PartStore.m
@implementation PartStore

+ (PartStore *)sharedStore
{
    static PartStore *sharedStore = nil;
    if (!sharedStore) {
        sharedStore = [[super allocWithZone:nil] init];
    }

    return sharedStore;
}

+ (id)allocWithZone:(NSZone *)zone
{
    return [self sharedStore];
}


@end
于 2013-05-16T13:22:29.883 に答える