傲视苍穹iOS《Objective-C》VIP专题iOS高级开发IOS知识积累

iOS 基于MVVM + RAC + ViewModel-Bas

2017-11-03  本文已影响1150人  CoderMikeHe
前言

这篇文章是iOS 基于MVVM + RAC + ViewModel-Based Navigation的微信开发(一)的续篇,主要目的就是继续分析以下几个核心问题,希望大家能知道其来龙去脉,并有所收获,文章略长,先马后看。

网络(Network)层

网络层在项目中扮演的角色,想必大家是心知肚明的,网络层通过请求服务器的数据,使得我们的应用变得动态性和有趣性。在微信(WeChat)Demo中,笔者主要赋予网络层(MHHTTPService)的职责是:网络数据(NetData)请求用户数据(UserData)处理。当然这只是笔者的一厢情愿罢了,大家肯定会有更好的职责和使命赋予网络层的。

网络数据(NetData)请求:目前绝大多数应用都是使用AFNetworking来做网络请求,当然常规套路都是为了避免第三方框架的侵略性和耦合性,都会基于AFNetworking封装成一个网络工具类,暴露请求数据/上传数据的API,以便后期使用的做法。例如:(XXHttpTool , XXNetworkTool , XXHttpHelper...)。如果项目比较复杂庞大的,数据请求可以集成YTKNetwork来实现,其底层实现也是基于AFNetworking来封装实现的,当然萝卜白菜,各有所爱,笔者主要是为了突出的是:封装

笔者在WeChat项目中采用的是笔者熟悉的套路,基于AFNetworking 3.1.0封装的一个网络请求工具单例(MHHTTPService)。但可能与以往常规的网络工具类的API,稍有差异,不要走开,请听笔者慢慢道来。当我们调用AFNetworkingGET/POST的方法请求网络数据成功/失败都是以block的形式传递出去的,所以平常网络请求工具类封装请求数据的API,也是通过block的形式传递数据的。类似于+ (void)get:(NSString *)url params:(NSDictionary *)params success:(void (^)(id responseObj))success failure:(void (^)(NSError *error))failure;这样,但是将其使用在MVVM + RAC + ViewModel-Based Navigation里面,常规做法都是在MHTableViewModel的子类中重写- (RACSignal *)requestRemoteDataSignalWithPage:(NSUInteger)page的方法来做数据请求,但是如果在该方法里面使用这种block的形式获取数据,就是有点显得格格不入,让人看着觉得别扭。

所以,最后笔者的做法是通过利用AFNetworking来做数据请求,而数据回调则使用ReactiveCocoa来传递数据信号(Signal),即:返回的数据是一个信号好RACSignal,这样就优雅的解决了上述Block返回数据的尴尬。在设计微信(WeChat)网路工具类的API以及内部实现时,笔者主要参照OctoKitAPI来开发设计的,以及数据请求和数据回调信号(RACSignal)的内部实现笔者主要参考的是AFNetworking-RACExtensionsOctoKit的实现方法,可谓是站在巨人的肩膀上开发的。大家有兴趣可以看看其源码,具体的细节还需自行体会。总之,最终的请求数据的方式笔者这里引用OctoKit的一段代码如下:

// Prepares a request that will load all of the user's repositories, represented
// by `OCTRepository` objects.
//
// Note that the request is not actually _sent_ until you use one of the
// -subscribe… methods below.
RACSignal *request = [client fetchUserRepositories];
// This method actually kicks off the request, handling any results using the
// blocks below.
[request subscribeNext:^(OCTRepository *repository) {
    // This block is invoked for _each_ result received, so you can deal with
    // them one-by-one as they arrive.
} error:^(NSError *error) {
    // Invoked when an error occurs.
    //
    // Your `next` and `completed` blocks won't be invoked after this point.
} completed:^{
    // Invoked when the request completes and we've received/processed all the
    // results.
    //
    // Your `next` and `error` blocks won't be invoked after this point.
}];

当然笔者的请求方式与OctoKit的又略有差异,这里笔者着重讲述一下,笔者在设计这套网络工具的思路和细节处理,当然这肯定不是唯一的封装方式,毕竟一千个人眼中有一千个潘金莲(哈姆雷特)嘛,只是为大家提供一个参考而已。Let‘s Do It...

HTTPCodeStructure.png
期待
  1. 文章若对您有些许帮助,请给个喜欢❤️,毕竟码字不易;若对您没啥帮助,请给点建议💗,切记学无止境。
  2. 针对文章所述内容,阅读期间任何疑问;请在文章底部评论指出,我会火速解决和修正问题。
  3. GitHub地址:https://github.com/CoderMikeHe
  4. 源码地址:WeChat
参考链接
上一篇下一篇

猜你喜欢

热点阅读