2013斯坦福大学iOS应用开发学习笔记 13 Core Data

来源:互联网 发布:网络星光大道张卫 编辑:程序博客网 时间:2024/05/29 04:03

这周主要看了Photomania中PhotomaniaAppDelegate的一些代码,认识了部分UIApplicationDelegate的函数,加深了关于block回调的理解

UIApplicationDelegate协议定义了在应用生命周期中,会被singleton UIApplication对象调用的,用来回应重要事件。Library中定义了一个iOS app的状态,Not running, Inactive, Active, Background, Suspend

在PhotomaniaAppDelegate.m中


1. UIApplicationDelegate

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

告诉delegate,启动过程马上就要结束,app马上准备run

self.PhotoDatabaseContext = [self createMainQueueManagedObjectContext]来获取managed Object Context,具体实现在PhotomaniaAppDelegate+MOC.m文件中,

在setPhotoDatabaseContext:方法中(由于Context的内容不断变化,fire掉当前flickrForegroundFetchTimer,然后@selector(startFlickrFetch)新建一个新的Timer,)使用广播,postNotificationName:object:userInfo,在photographerCDTVC.m中的awakeFromNib调用addObserverForName:object:queue:usingBlock:接收通知, 从而setManagedObjectContext

调用[self startFlickrFetch]来看是否我们working on a fetch,如果没有,就start one up,如果有task,就running,即,getTasksWithCompletionHandler:方法传消息给实例变量flickrDownloadSession,通过Session中的tasks,异步调用一个完成的callback



- (NSURLSession *)flickrDownloadSession

其中使用了单例模式dispatch_once,并且将NSURLSession配置为delegate:self;

从而在PhotomaniaAPPDelegate.m中,调用NSURLSessionDownloadDelegate协议中required的method

- URLSession:downloadTask:didFinishDownloadingToURL:

    调用loadFlickrPhotosFromLocalURL:intoContext:andThenExecuteBlock:方法,把Flickr上的数据下载到LocalFile,并把数据存入Core Data当中,Block中调用FlickrDownloadTaskMightBeComplete:方法(其是出于多download情况的考虑)

- URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:

- URLSession:downloadTask:didWritten:totalBytesExpectedToWrite:




2. 后台下载

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

告诉app,它可以开始一个fetch的动作如果它有data要download

background flickrDownloadSession去fetch通过调用[self startFlickrFetch],但是这样的调用很weak

在这个函数当中,调用loadFlickrPhotosFromLocalURL:intoContext:andThenExecuteBlock:方法,把Flickr上的数据下载到LocalFile,并把数据存入Core Data当中

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler

告诉app,与URLSession有关的事件正在等着被执行

(只要我们request的background Session有return,就会调用,当我们在background的时候,有必要waking我们来处理它)

实现部分:注册了当我们在完成FlickrDownloadSession的CompletionHandleer

在FlickrDownloadTaskMightBeComplete:方法中调用


3.NSURLSession

NSURLSessionDownloadDelegate中有三个required的method,和之前的NSURLConnection并列,网络接口

- URLSession:downloadTask:didFinishDownloadingToURL:


objc(5.4)中有:

NSURLConnection由两个方法可以表明一个请求已经完成(NSURLConnectionDataDelegate -connectionDidFinishLoading: 和 NSURLConnectionDelegate -connection:didFailWithError:),而NSURLSession只有一个委托方法(NSURLSessionTaskDelegate -URLSession:task:didCompleteWithError: (告诉delegate,task已经完成data的transfer,并可以用来Catch Error)

-getTasksWithCompletionHandler:

Session里面的task完成后的CompletionHandler(异步的completion callback)

查看download中是否有其他的Flickrdownload

4.Core Data核心的类

  

                                         060906207527825.jpg

  • Persistent Object Store:可以理解为存储持久对象的数据库(例如SQLite,注意Core Data也支持其他类型的数据存储,例如xml、二进制数据等)。 
  • Managed Object Model:对象模型,对应Xcode中创建的模型文件。 
  • Persistent Store Coordinator:对象模型和实体类之间的转换协调器,用于管理不同存储对象的上下文。 
  • Managed Object Context:对象管理上下文,负责实体对象和数据库之间的交互。

createMainQueueManagedObjectContext 调用 createPersistentStoreCoordinator 调用 createManagedObjectModel 

24752_1314850908RwoV.png

设计模式六大原则分别是

单一职责原则(SPR)、

开放-封闭原则:可以扩展但不应该修改

里氏代换原则(LSP):子类必须完全能够替代父类

依赖倒转原则:A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体,具体应该依赖于抽象。

迪米特原则(LoD):也叫最少知识原则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

合成/聚合复用原则(CARP):尽量少使用类的继承


面向对象设计的基本原则


0 0