这周主要看了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核心的类
- Persistent Object Store:可以理解为存储持久对象的数据库(例如SQLite,注意Core Data也支持其他类型的数据存储,例如xml、二进制数据等)。
- Managed Object Model:对象模型,对应Xcode中创建的模型文件。
- Persistent Store Coordinator:对象模型和实体类之间的转换协调器,用于管理不同存储对象的上下文。
- Managed Object Context:对象管理上下文,负责实体对象和数据库之间的交互。
createMainQueueManagedObjectContext 调用 createPersistentStoreCoordinator 调用 createManagedObjectModel
设计模式六大原则分别是
单一职责原则(SPR)、
开放-封闭原则:可以扩展但不应该修改
里氏代换原则(LSP):子类必须完全能够替代父类
依赖倒转原则:A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体,具体应该依赖于抽象。
迪米特原则(LoD):也叫最少知识原则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
合成/聚合复用原则(CARP):尽量少使用类的继承
面向对象设计的基本原则