這是蘋果官方文檔 Core Data Programming Guide 的渣翻譯往枷。
在iOS和OS X上,一個應(yīng)用的生命周期開端略有不同梅尤。
當一個OS X應(yīng)用花費了很長的一段時間去啟動并且反應(yīng)越來越慢的時候音婶,系統(tǒng)會改變光標來展示狀態(tài)。用戶可以決定是否等待應(yīng)用啟動完畢亦或是關(guān)閉這個應(yīng)用伞梯。
在iOS上,卻沒有這個概念帚屉。如果一個應(yīng)用在既定時間內(nèi)沒有啟動完畢谜诫,操作系統(tǒng)就會終止這個應(yīng)用。因此涮阔,盡可能快地完成一個應(yīng)用的啟動過程是十分關(guān)鍵的猜绣。
另一方面,作為應(yīng)用生命周期第一步的Core Data初始化過程敬特,只有完成了這個過程應(yīng)用才能訪問Core Data數(shù)據(jù),你當然是希望越快越好牺陶。雖然不是經(jīng)常發(fā)生伟阔,但是Core Data偶爾會花費比平常更多的時間去完成初始化。
因此掰伸,在iOS應(yīng)用中推薦使用把啟動過程分成兩部分皱炉,來避免應(yīng)用被終止:
- 一個盡可能小的能夠告訴用戶應(yīng)用正在啟動的過程。
- 在Core Data完成初始化后立刻完成UI加載狮鸭。
在iOS中初始化Core Data
第一步就是修改application:didFinishLaunchingWithOptions:方法的實現(xiàn)合搅。在application:didFinishLaunchingWithOptions:方法中需要初始化Core Data還有其他一些瑣碎的事。如果你正在使用storyboard歧蕉,你可以進一步在這里設(shè)置啟動圖片灾部。
作為Core Data初始化的一部分,可以把配置持久化存取區(qū)(NSPersistentStore)到持久化存儲協(xié)調(diào)器(NSPersistentStoreCoordinator)這一過程放到后臺隊列中運行惯退。這個過程可能會耗費不知多長的時間赌髓,如果在主線程運行會阻塞用戶界面,可能還會導致應(yīng)用被殺死催跪。
當持久化存儲區(qū)被配置到了持久化存儲協(xié)調(diào)器之后锁蠕,你就可以重新回到主線程讓用戶界面構(gòu)建完畢并且展示給用戶。
把Core Data從Application Delegate分離
在之前的iOS版本中懊蒸,Core Data棧都是在application delegate里面初始化的荣倾。然而,這樣做會導致大量的代碼混雜在應(yīng)用聲明周期事件處理邏輯之中骑丸。
推薦讓Core Data棧在一個自己創(chuàng)建的一個控制器里面初始化舌仍,并且由application delegate創(chuàng)建并持有這個控制器的引用妒貌。這樣做可以提升Core Data的內(nèi)聚性并且讓application delegate更加整潔。這個獨立的控制器細節(jié)可以在之前1.2章節(jié)里面找到抡笼。
從“1.2 初始化Core Data椝沾В”章節(jié)中整合代碼到iOS應(yīng)用中,并且在application delegate添加一個屬性推姻,在applicationDidFinishLaunching生命周期方法中創(chuàng)建這個控制器并引用它平匈。
OBJECTIVE-C
@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
SWIFT
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
}
利用在completion block中創(chuàng)建、初始化一個獨立的控制器藏古,你成功將Core Data棧從application delegate分離了出來增炭,并且還給application delegate配置了一個回調(diào),以便用戶界面接口能夠知道什么時候開始請求數(shù)據(jù)拧晕。