gpt4 book ai didi

ios - 核心数据初始化

转载 作者:行者123 更新时间:2023-11-29 11:54:58 25 4
gpt4 key购买 nike

查看 Apple 文档,我发现他们建议从 AppDelegate 中删除核心数据初始化代码。他们的方法如下。

下面是我没看懂的地方

  1. 文档中的以下句子。如何回调应用程序委托(delegate)?我没有在下面的代码片段中看到一个。这是他们希望我们添加的内容吗?

通过使用完成 block 初始化单独的 Controller 对象,您已将 Core Data 堆栈移出应用程序委托(delegate),但您仍然允许回调到应用程序委托(delegate),以便用户界面可以知道何时开始请求数据。

  1. AppDelegate 调用 DataController 的 init,这又调用 initializeCoreData。但是 initializeCoreData 在后台线程中设置持久存储协调器。这意味着如果我们转换到应用程序的第一个 View 并且它的 View Controller 从核心数据请求数据,那么事情还没有建立起来。这不会成为问题吗?这是否意味着他们希望我们显示一个不同的启动屏幕并注册一个回调,告诉我们在移动到实际第一个应用程序 View 之前完成了 CoreData 初始化。

文档中的 AppDelegate 代码

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[self setDataController:[[DataController alloc] init];
// Basic User Interface initialization
return YES;
}

文档中的 DataController 代码

@interface MyDataController : NSObject

@property (strong) NSManagedObjectContext *managedObjectContext;

-(void)initializeCoreData;

@end

@implementation MyDataController

-(id)init {

self = [super init];
if (!self) return nil;

[self initializeCoreData];

return self;
}

- (void)initializeCoreData {

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DataModel" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSAssert(mom != nil, @"Error initializing Managed Object Model");

NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];
[self setManagedObjectContext:moc];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"DataModel.sqlite"];

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSError *error = nil;
NSPersistentStoreCoordinator *psc = [[self managedObjectContext] persistentStoreCoordinator];
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
});
}

最佳答案

1)

In the Core Data programming guide you're looking at ,作者正在从 App Delegate 中取出核心数据(这往往会被大量额外的代码弄得乱七八糟,开发人员实际上应该将这些代码拆分成单独的对象)。

文档的其余部分解释:

It is recommended that the Core Data stack be created within its own top-level controller object and that the application delegate initialize that controller object and hold a reference to it. This action will promote the consolidation of the Core Data code within its own controller and keep the application delegate relatively clean.

还有:

assign the adding of the persistent store (NSPersistentStore) to the persistent store coordinator (NSPersistentStoreCoordinator) to a background queue. That action can take an unknown amount of time, and performing it on the main queue can block the user interface, possibly causing the application to terminate.

Once the persistent store has been added to the persistent store coordinator, you can then call back onto the main queue and request that the user interface be completed and displayed to the user

所以是的,当您的第一个 View Controller 显示时,CoreData 可能不一定完全启动,但是如果您有一个观察者从该后台队列中寻找 NSNotification,您可以告诉您的 UI当 CoreData 准备好被依赖时。

2)

[DataController init] 不会返回 DataController 对象,直到 initializeCoreData 返回,所以您的 UI 直到 之后才会显示didFinishLaunchingWithOptions 返回,您应该已经有一个 DataController 对象。

关于ios - 核心数据初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39560195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com