MKNetworkKit对网络请求的完美封装

MKNetworkKit对网络请求的完美封装

MKNetworkKit使用解析

  • 什么是MKNetworkKit
  • MKNetworkKit的特性
  • 如何使用MKNetworkKit

(1)、MKNetworkKit是什么

MKNetworkKit是结合了ASIHttpRequest和AFNetworking两个网络框架而形成的第三方框架,在自己的项目里导入这个框架之后,只需要在自己的项目里写很少的代码,就可以完成繁重的网络请求工作。

(2)、MKNetworkKit的特性

a、超轻量级:MKNetworkKit只有两个主类MKNetworkEngine、MKNetworkOperation以及一些类目:category和一个管理网络状态变化的类Reachability。

b、共享的单一队列:此特性可以设置网络链接标志的状态

导入MKNetworkKit之后,它会为所有的网络请求操作创建一个单一的共享队列_sharedNetworkQueue。有了_sharedNetworkQueue,就可以根据_sharedNetworkQueue的operationCount设置网络链接的标志(我们通常设置的风火轮)。

网络链接状态的具体实现如下所示:

 1、注册通知:

+(void) initialize {

   if(!_sharedNetworkQueue) {

    static dispatch_once_t oncePredicate;

    dispatch_once(&oncePredicate, ^{

      _sharedNetworkQueue = [[NSOperationQueue alloc] init];

 //为网络请求的个数注册通知,operationCount是NSOperation的一个属性

      [_sharedNetworkQueue addObserver:[self self] forKeyPath:@"operationCount" options:0 context:NULL];

       });

  }

}

2、监听到通知时调用的方法:

    [UIApplication sharedApplication].networkActivityIndicatorVisible =

    ([_sharedNetworkQueue.operations count] > 0);

要理解这一点必须要明白:添加到_sharedNetworkQueue的MKNetworkOperation被_sharedNetworkQueue强持有,当MKNetworkOperation的网络请求finished之后,才会被释放,所以当有网络请求(及网络请求没有finished时),_sharedNetworkQueue的operationCount就一直大于0。

c、Auto queue sizing自动队列大小:当手机处于不同的移动网络状态时,我们应该设置相应的网络请求的并发个数。这样就可以提高应用程序网络操作的效率。而这些工作MKNetworkKit已经都帮我们做好了。

为网络变化注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self

                                               selector:@selector(reachabilityChanged:)

                                                   name:kReachabilityChangedNotification

                                                 object:nil];

当监听到通知时,会调用reachabilityChanged:方法。在这个方法里主要实现两步操作:

1、根据当前的网络环调用方法[_sharedNetworkQueue setMaxConcurrentOperationCount:2]设置网络请求的并发个数。

2、如果当前网络是可用的,还要调用[self checkAndRestoreFrozenOperations]方法重新运行被冻结的网络操作。

d、自动缓存策略。如果在项目里子类话的MKNetworkEngine是通过get方式请求网络的,且设置了其userCache属性为yes,则MKNetworkKit默认会为此次网络请求创建缓存。

当再此请求网络时,如果缓存中的数据可用就从缓存中加载,如果设置了forceReload属性为yes(即使缓存存在,还是要从网络中重新加载数据)就会重新发送网络请求返回数据。

e、操作的冻结和解冻:

网络操作冻结:当网络不可用的时,为防止网络链接丢失,操作会被序列化并写入到缓存中;

操作解冻:当网络可用时,会调用[self checkAndRestoreFrozenOperations]方法检测冻结的操作,并开启执行。

操作冻结和解冻的前提是:

 1、使用了缓存策略(因为所有冻结操作,是要写入到缓存中的                   

 2、设置网络请求操作[MKNetworkOperation setFreezable]=yes,

你也许会问,缓存中保存的网络操作,不止有被冻结的操作,我可不想让已经完成的操作也再重新执行一下。那怎么区别他们呢??

那就让我们看看MKNetworkKit是怎么帮我们解决的吧:

首先当冻结操作的时候它会为每一个冻结的操作加上一个标示:kFreezableOperationExtension,然后写入到缓存中,代码如下:

NSString *archivePath = [[[self cacheDirectoryName] stringByAppendingPathComponent:[operation uniqueIdentifier]]

                             stringByAppendingPathExtension:kFreezableOperationExtension];

    [NSKeyedArchiver archiveRootObject:operation toFile:archivePath];

当解冻的时候:从缓存文件中查找所有的操作([self checkAndRestoreFrozenOperations]),如果查询到的操作含有标示:kFreezableOperationExtension(说明是被冻结的操作)就加入到队列中重新执行。

f、图片缓存:MKNetworkKit可以无缝的缓存缩略图。通过重写几个方法,你可以设置缓存多少张图片在内存缓存以及缓存的目录。重写这些方法完全是可选的。

对于这一点我不太理解,网大家见谅。不过我会好好研究的。

g、  Performance性能:

只要开发这设置了可选的属性,就可以在发送网络请求的时候,创建缓存,提高了网络请求的效率。而且当内存发生警告的时候,会将memoryCache中的缓存写如缓存目录。

下面的代码是为内存警告注册通知:当接受到内存警告的通知时,会调用saveCache写缓存。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveCache)

                                               name:UIApplicationDidReceiveMemoryWarningNotification

                                             object:nil];

h:完全支持 ARC

 ARC将会成为一种趋势,而MKNetworkKit完全支持ARC.所以在以后的代码生涯中,我们就不用担心不能在我们的ARC项目里使用MKNetworkKit啦。

(3)MKNetworkKit的使用:

MKNetworkKit封装的如此完美,所以对于开发这来说,用起来就会非常方便:

(3)、MKNetworkKit的使用

a、使用MKNetworkKit的准备工作

1.拖拽MKNetworkKit的目录到你的工程里

2.添加 CFNetwork.Framework, SystemConfiguration.framework and Security.framework 依赖库

3.在PCH文件中包含 MKNetworkKit.h

4.删除 NSAlert+MKNetworkKitAdditions.h如果你开发的是iOS程序。

5.删除 UIAlertView+MKNetworkKitAdditions.h如果你开发的是Mac程序。

b、使用MKNetworkKit的步骤:

           1、子类话MKNetworkEngine

           2、创建url

           2、子类话MKNetworkOperation对象

           3、设置MKNetworkOperation对象的属性

                eg:设置useCache属性、Freezable属性等等。

          4、设置MKNetworkOperation对象的完成操作之后调用的block,

addCompletionHandler^(MKNetworkOperation* completedOperation);

          5、将MKNetworkOperation添加到共享队列中_sharedNetworkQueue中即发送请求。

在这里要说明一下,不同的请求比如:上传图片、下载文件等,他们的步骤是有区别的,但是大致的请求方式都是一样的。

MKNetworkKit封装的很好,所以使用起来非常简单,不过若想理解MKNetworkKit的实现原理和代码,这是一个艰难且持久话的过程。对于MKNetworkKit的研究还在进行中 ……..


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值