Reading Code TWO

2018-03-14  本文已影响3人  iLeooooo

引入:读AFNetworking ~> '0.5.1'

一、NSAutoreleasePool

虽然ARC引入之后NSAutoReleasePool的使用有了很大变化,但是了解NSAutoReleasePool的机制还是十分必要的,下面主要说一下:

NSAutoReleasePool * pool = [NSAutoReleasePool alloc] init];
//do something
[[NSRunLoop currentRunLoop] run];
[pool drain];

之后,
[pool drain][pool release] 的区别:

  1. release,在引用计数环境下,由于NSAutoReleasePool是一个不可以被retain的类型,所以release会直接dealloc pool对象。当pool被dealloc的时候,pool向所有在pool中的对象发出一个release的消息,如果一个对象在这个pool中autorelease了多次,pool对这个对象的每一次autorelease都会release。在GC环境下release是一个no-op操作(代表没有操作,是一个占据进行很少的空间但是指出没有操作的计算机指令)。

  2. drain,在引用计数环境下,它的行为和release是一样的。在GC的环境下,这个方法调用objc_collect_if_needed出发GC。

因此,重点是:在GC环境下,release是一个no-op,所以除非你不希望在GC环境下出发GC,你都应该使用drain而不是使用release来释放pool。

引入:

- (void)setCancelled:(BOOL)isCancelled {
    [self willChangeValueForKey:@"isCancelled"];
    _cancelled = YES;
    [self didChangeValueForKey:@"isCancelled"];

    self.state = AFHTTPOperationFinishedState;
}
二、键-值编码(KVC)、KVO、NSNotificationCenter
键-值编码 KVC

setValue:forKey:通过名称(字符串)设置任何属性的值,字符串可在运行时修改

[aObject setValue:theValue forKey:theKey];

valueForKey:从对象中获取属性的值

NSString *aString = [aObject valueForKey:theKey];

其实与getter,setter一样,但更加灵活。

键-值观察 Key-Value Observing, KVO

控制器获知何时更新视图

  1. 当属性修改时,需要被通知的对象(观察者)
  2. 被观察者的属性名称
  3. 当一个变化发生时,观察者应该被告知的信息
  4. [optional]包含一个指针或引用,当属性值发生变化时,指针或对象引用应该被传递到运行的方法中
[aProduct addObserver:self
           forKeyPath:@"productName"
              options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
              context:nil];
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualToString:@"productName"])
    {
        NSString *newName = [change objectForKey:NSKeyValueChangeNew];
    
        //通知响相应视图根据newName变量的值进行更新
    }
}

使用了Objective-C的属性@property,当setter被调用时,Cocoa自动通知任何已注册的观察者

不使用属性,或重写了setter,需要手动通知系统

对self对象调用willChangeValueForKey与didChangeValueForKey,跟踪新值,旧值
重写setter,同时允许KVO工作

- (void) setProductName:(NSString *)newProductName
{
    [self willchangeValueForKey:@"productName"];
    productName = newProductName;
    [self didChangeValueForKey:@"productName"];
}
使用NSNotification进行通知

某些相关联的事情发生,使用广播通知
按下Home键

  1. NSNotification对注册对象发送广播通知,由NSNotificationCenter管理,是单例对象
    相应Home键按下
  2. 注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnteredBackground:) UIApplicationDidEnterBackgroundNotification object:nil];
  1. UIApplicationDidEnterBackgroundNotification传递出去,注册的对象将运行applicationenteredBackground:方法,此方法定义在该对象所属类中
- (void)applicationEnteredBackground:(NSNotification *)notification
{
    //进入后台,进行处理
}
  1. 不希望接收到消息
[[NSNotificationCenter defaultCenter] removeObserver:self]

引入:

在阅读AFN的源码的时候,发现只有(HTTP、Image)RequestOperation和AFRestClient。RequestOperation很好理解就是一项请求操作,里面包括了NSURLConnection的代理方法,在这里进行网络请求,得到服务器返回的数据,但是在这里并没有执行这个操作,只是把这个请求操作封装好了。(这个时候我就想应该会在某个地方调用[operation start]这个方法来获取数据,但是我搜索整个库,发现并没有地方调用这个操作,这就很纳闷了)AFN是怎么开始开始请求的呢,后面发现在AFRestClient里面用到了这个operation,AFRestClient先是对请求头,请求方法和请求参数进行了一次封装,然后就是执行相应的RequestOperation,但是这里也没有调用[operation start],只是调用了[self.operationQueue addOperation:operation]这时候去查资料,才有了下面的内容

AFHTTPRequestOperation *operation = [AFJSONRequestOperation operationWithRequest:request success:success failure:failure];
[self.operationQueue addOperation:operation];
三、Operation
四、AFNetworking的内容

封装一整套请求操作,有NSURLConnection的代理方法,得到服务器返回的数据,还有对抽象类NSOperation的具体实现,是下面图片链接请求和JSON数据请求的基类

对图片进行缓存和获取缓存图片,使用的是图片链接+图片的尺寸当做key缓存的

单独对网络图片请求进行封装,对图片进行简单的处理,同时在请求到图片后,对图片进行缓存

处理返回结果,把结果JSON格式化,首先是判断没有错误,然后判断是否包含正确的状态码,如果不包含,自定义error,再判断是否包含正确MIMEType,如果不包含,自定义error,再判断如果错误,返回failure块,包含请求,响应,错误,如果返回结果长度为0,直接返回success,最后异步处理正常情况,请求成功,有数据,如果系统版本大于4.3,使用系统自带的NSJSONSerialization,对返回数据JSON化,如果小于4.3,使用第三方框架JSONKit,对返回数据JSON化,处理成功返回success(request, response, JSON),处理失败返回failure(request, response, JSONError)

对状态栏网络信号小菊花的简单封装,开始和结束动画

真正开始请求网络的地方,包含get、post、pull、delete请求方法,也可以取消网络请求,设置请求头

NSData的扩展,包括base64编码,压缩和解压,使用的是zlib压缩函式库

NSMutableURLRequest的扩展,提供对请求体的处理方法

NSString的扩展,提供对请求链接url使用当初ASI里面的方法编码CFURLCreateStringByAddingPercentEscapes

UIImage扩展,对UIImage进行裁剪,带圆角的裁剪

UIImageView的扩展,提供给我们之间使用的,设置网络图片链接给UIImageView来展示图片,如果有缓存改图片,之间去缓存图片,取消网络请求

简单整理,如果错误,欢迎指正,谢谢~
持续更新

上一篇 下一篇

猜你喜欢

热点阅读