Integrating Core Data at iOS Startup
ios和os x的程序初始化周期不同。
当os x应用程序执行了一个超长时间的操作并且变得无法响应的时候,操作系统会将鼠标改变来提醒用户。用户可以选择是继续等待应用程序完成海试关闭应用程序。
在ios里,没有这样的概念。如果app在一定时间内么有加载成功,操作系统就会终止掉应用程序。因此,应用程序快速启动是至关重要的。
另一方面,你想让应用程序能尽快的访问core data内部的数据,通常意味着在程序生命周期的第一阶段就要初始化。虽然非典型,core data可能会花费多于平常的时间来完成初始化。
因此,推荐在ios app的启动时,分两步处理来防止app被迫中断。
-
最小限度的启动来指明应用程序正在加载。
-
一旦core data完成初始化,就完成应用程序ui的加载。
Initializing Core Data in iOS
第一步在application:didFinishLaunchingWithOptions:
方法中实现。在这个方法中考虑初始化core data。如果你正在使用storyboard,你可以继续在这个方法中展示launch图片。
作为core data初始化的一部分,在后台队列中将NSPersistentStore
添加到NSPersistentStoreCoordinator
。这个操作可能会占用比较多的时间,如果在主队列上操作可能会block住用户交互接口而导致应用程序被破终止。
一旦持计划存储被添加到persistent store coordinator,你可以回到主队列并且请求user interface完成和展示。
Separating Core Data from the Application Delegate
先前在ios中,core data栈主要在application delegate中被初始化。但是这样的操作使得代码一塌糊涂。
因此建议core data栈放在自己同等级的controller对象中进行创建。应用程序delegate初始化controller对象并且持有这个controller的引用。
例子如下:
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) DataController *dataController;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self setDataController:[[DataController alloc] init];
// Basic User Interface initialization
return YES;
}
@end
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var dataController: DataController!
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
dataController = DataController()
// Basic User Interface initialization
return true
}
通过独立的controller对象初始化,将core data栈移出了application delegate,但是你仍然允许到application delegate的回调,因此用户接口能知道何时开始请求数据。