一备图、回顧
在上一篇中影所,我們著重介紹了如何將現(xiàn)有的網(wǎng)絡(luò)庫進(jìn)行RAC封裝氢哮。這篇將講解具體的使用。先從ViewModelServices說起型檀。
二、DDViewModelServices
目前听盖,app業(yè)務(wù)層的整體架構(gòu)如上圖所示胀溺。在ViewModel和ViewModel之間傳遞了DDViewModelServicesImpl(實(shí)現(xiàn)了DDViewModelServices協(xié)議的)對(duì)象裂七。如:
STTaskDetailViewModel *viewModel = [[STTaskDetailViewModel alloc] initWithServices:self.services params:@{}];
[self.services pushViewModel:viewModel animated:YES];
由上圖可以看出,所有網(wǎng)絡(luò)相關(guān)的調(diào)用都是在ViewModel中進(jìn)行的仓坞,ViewModel負(fù)責(zé)數(shù)據(jù)的獲取以及處理背零。那么我們給DDViewModelServices增加一個(gè)property。
@protocol DDViewModelServices <NSObject, DDNavigationProtocol>
@property (nonatomic, strong) DDNetWorkManger *client;
@end
然后在app打開之后无埃,初始化首頁的時(shí)候徙瓶,給實(shí)現(xiàn)了DDViewModelServices協(xié)議的DDViewModelServicesImpl對(duì)象,初始化網(wǎng)絡(luò)管理對(duì)象client嫉称。這樣侦镇,在ViewModel和ViewModel之間push或者present的時(shí)候,就可以把對(duì)應(yīng)的client進(jìn)行傳遞了:
// 初始化client
DDNetWorkManger *client = [DDNetWorkManger defaultManger];
// 這個(gè)client通過services在ViewModel之間傳遞织阅。
DDSharedAppDelegate.services.client = client;
OrderListViewModel *viewModel = [[OrderListViewModel alloc] initWithServices:DDSharedAppDelegate.services params:nil];
其中DDSharedAppDelegate是一個(gè)宏壳繁。
#define DDSharedAppDelegate ((AppDelegate *)([UIApplication sharedApplication].delegate))
AppDelegate保持了一個(gè)DDViewModelServicesImpl,所有后續(xù)ViewModel的services都是從這里傳遞的荔棉。
AppDelegate.h
@interface AppDelegate : DDAppDelegate
@property (nonatomic, strong, readonly) DDViewModelServicesImpl *services;
...
@end
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
self.services = [[DDViewModelServicesImpl alloc] init];
...
return YES;
}
到這里闹炉,清楚了網(wǎng)絡(luò)請(qǐng)求發(fā)生的層級(jí),以及client對(duì)象是如何傳遞的润樱。那么渣触,我們下一步要結(jié)合DDNetWorkManger+RAC
來進(jìn)行不同業(yè)務(wù)模塊的網(wǎng)絡(luò)請(qǐng)求信號(hào)封裝。
三壹若、DDNetWorkManger擴(kuò)展
其中DDNetWorkManger+RAC
是網(wǎng)絡(luò)庫的RAC封裝嗅钻。DDNetWorkManger+SevenFresh
、DDNetWorkManger+TaskFlow
舌稀、DDNetWorkManger+MyTask
都是和具體業(yè)務(wù)有關(guān)的網(wǎng)絡(luò)庫擴(kuò)展啊犬,分別為7-fresh、訂單流程壁查、我的任務(wù)業(yè)務(wù)模塊觉至。當(dāng)然,隨著業(yè)務(wù)的發(fā)展睡腿,可以一直增加對(duì)應(yīng)的DDNetWorkManger
業(yè)務(wù)擴(kuò)展语御。每個(gè)業(yè)務(wù)擴(kuò)展里面只封裝與該業(yè)務(wù)相關(guān)的網(wǎng)絡(luò)層請(qǐng)求:
DDNetWorkManger+TaskFlow.h
@interface DDNetWorkManger (TaskFlow)
...
// 根據(jù)類型,獲取任務(wù)列表席怪。
- (RACSignal *)signal_requestTaskListWithType:(NSNumber *)type;
// 請(qǐng)求派單數(shù)據(jù)应闯。
- (RACSignal *)signal_requestRecommendTaskWithIdentifier:(NSString *)taskID;
...
@end
DDNetWorkManger+TaskFlow.m
@implementation DDNetWorkManger (TaskFlow)
...
#pragma mark -
- (RACSignal *)signal_requestTaskListWithType:(NSNumber *)type
{
...
DDRequestInfo *request = [DDRequestInfo xxxxxx];
return [[self enqueueRequest:request method:DDHTTPMethodGET resultClass:[DDAPIResult class]] dd_parsedResults];
}
- (RACSignal *)signal_requestRecommendTaskWithIdentifier:(NSString *)taskID
{
...
DDRequestInfo *request = [DDRequestInfo xxxxx];
return [[self enqueueRequest:request method:DDHTTPMethodGET resultClass:[DDAPIResult class]] dd_parsedResults];
}
...
@end
到這里,我們就將不同業(yè)務(wù)對(duì)應(yīng)的網(wǎng)絡(luò)層請(qǐng)求挂捻,借助DDNetWorkManger+RAC
封裝成了信號(hào)碉纺。
四、訂閱網(wǎng)絡(luò)層信號(hào)
我們給ViewModelServices增加了網(wǎng)絡(luò)層DDNetWorkManger
類型的Client
。然后骨田,將實(shí)現(xiàn)這個(gè)Services協(xié)議的DDViewModelServicesImpl類型的對(duì)象services在ViewModel之間傳遞耿导。然后通過這個(gè)services.client訂閱DDNetWorkManger
對(duì)應(yīng)的業(yè)務(wù)擴(kuò)展中的信號(hào)。
STTaskFlowViewModel.h
@interface STTaskFlowViewModel : DDTableViewModel
...
// 任務(wù)列表
@property (nonatomic, strong, readonly) RACCommand *requestTaskListCommand;
...
@end
STTaskFlowViewModel.m
- (RACCommand *)requestTaskListCommand
{
if (!_requestTaskListCommand)
{
WSELF;
_requestTaskListCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(NSNumber *type) {
SSELF;
return [self.services.client signal_requestTaskListWithType:type];
}];
}
return _requestTaskListCommand;
}
然后在需要獲取數(shù)據(jù)的地方如下調(diào)用即可:
[[self.requestTaskListCommand.executionSignals.switchToLatest map:^id _Nullable(id _Nullable value) {
...
return value;
}] subscribeNext:^(DDAPIResult *result) {
...
}];
五态贤、總結(jié)
首先創(chuàng)建DDNetWorkManger
的相應(yīng)業(yè)務(wù)擴(kuò)展舱呻,并將DDNetWorkManger+RAC
包含進(jìn)來。
然后在擴(kuò)展中封裝網(wǎng)絡(luò)請(qǐng)求的信號(hào)悠汽。
再在ViewModel中實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)請(qǐng)求信號(hào)的訂閱箱吕。