美文网首页iOS OCAFNetworking源码探究
AFNetworking源码探究(二十五) —— UIKit相关

AFNetworking源码探究(二十五) —— UIKit相关

作者: 刀客传奇 | 来源:发表于2018-03-07 00:36 被阅读167次

    版本记录

    版本号 时间
    V1.0 2018.03.06

    前言

    我们做APP发起网络请求,都离不开一个非常有用的框架AFNetworking,可以说这个框架的知名度已经超过了苹果的底层网络请求部分,很多人可能不知道苹果底层是如何发起网络请求的,但是一定知道AFNetworking,接下来几篇我们就一起详细的解析一下这个框架。感兴趣的可以看上面写的几篇。
    1. AFNetworking源码探究(一) —— 基本介绍
    2. AFNetworking源码探究(二) —— GET请求实现之NSURLSessionDataTask实例化(一)
    3. AFNetworking源码探究(三) —— GET请求实现之任务进度设置和通知监听(一)
    4. AFNetworking源码探究(四) —— GET请求实现之代理转发思想(一)
    5. AFNetworking源码探究(五) —— AFURLSessionManager中NSURLSessionDelegate详细解析(一)
    6. AFNetworking源码探究(六) —— AFURLSessionManager中NSURLSessionTaskDelegate详细解析(一)
    7. AFNetworking源码探究(七) —— AFURLSessionManager中NSURLSessionDataDelegate详细解析(一)
    8. AFNetworking源码探究(八) —— AFURLSessionManager中NSURLSessionDownloadDelegate详细解析(一)
    9. AFNetworking源码探究(九) —— AFURLSessionManagerTaskDelegate中三个转发代理方法详细解析(一)
    10. AFNetworking源码探究(十) —— 数据解析之数据解析架构的分析(一)
    11. AFNetworking源码探究(十一) —— 数据解析之子类中协议方法的实现(二)
    12. AFNetworking源码探究(十二) —— 数据解析之子类中协议方法的实现(三)
    13. AFNetworking源码探究(十三) —— AFSecurityPolicy与安全认证 (一)
    14. AFNetworking源码探究(十四) —— AFSecurityPolicy与安全认证 (二)
    15. AFNetworking源码探究(十五) —— 请求序列化之架构分析(一)
    16. AFNetworking源码探究(十六) —— 请求序列化之协议方法的实现(二)
    17. AFNetworking源码探究(十七) —— _AFURLSessionTaskSwizzling实现方法交换(转载)(一)
    18. AFNetworking源码探究(十八) —— UIKit相关之AFNetworkActivityIndicatorManager(一)
    19. AFNetworking源码探究(十九) —— UIKit相关之几个分类(二)
    20. AFNetworking源码探究(二十) —— UIKit相关之AFImageDownloader图像下载(三)
    21. AFNetworking源码探究(二十一) —— UIKit相关之UIImageView+AFNetworking分类(四)
    22. AFNetworking源码探究(二十二) —— UIKit相关之UIButton+AFNetworking分类(五)
    23. AFNetworking源码探究(二十三) —— UIKit相关之UIWebView+AFNetworking分类(六)
    24. AFNetworking源码探究(二十四) —— UIKit相关之UIProgressView+AFNetworking分类(七)

    回顾

    上一篇主要分析了UIProgressView+AFNetworking分类,主要实现了上传任务和下载任务与进度之间的绑定。这一篇主要分析UIRefreshControl+AFNetworking这个分类。


    接口API

    下面看一下接口API

    /**
     This category adds methods to the UIKit framework's `UIRefreshControl` class. The methods in this category provide support for automatically beginning and ending refreshing depending on the loading state of a session task.
     */
    @interface UIRefreshControl (AFNetworking)
    
    ///-----------------------------------
    /// @name Refreshing for Session Tasks
    ///-----------------------------------
    
    /**
     Binds the refreshing state to the state of the specified task.
     
     @param task The task. If `nil`, automatic updating from any previously specified operation will be disabled.
     */
    - (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task;
    
    @end
    

    该类为UIKit框架的UIRefreshControl类添加方法。 根据会话任务的加载状态,此类别中的方法支持自动开始和结束刷新。

    该接口就一个方法,将任务状态和刷新状态进行了绑定。


    通知观察者类

    在.m实现中,大家会发现不仅是这个AFNetworking分类,还有一个通知贯彻者类AFRefreshControlNotificationObserver。这个通知观察者类起到观察任务状态的作用,并且.h文件中那个方法的接口,可以进行了消息的转发,最后在AFRefreshControlNotificationObserver中进行了处理。

    下面我们先看一下这个通知观察者类接口。

    @interface AFRefreshControlNotificationObserver : NSObject
    
    @property (readonly, nonatomic, weak) UIRefreshControl *refreshControl;
    
    // 用于初始化
    - (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl;
    
    // 用于.h中方法的转发实现
    - (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task;
    
    @end
    

    AFNetworking runtime绑定观察者

    这里就是利用runtime给AFNetworking类绑定观察者,在里面实例化了AFRefreshControlNotificationObserver并进行了绑定。

    - (AFRefreshControlNotificationObserver *)af_notificationObserver {
        AFRefreshControlNotificationObserver *notificationObserver = objc_getAssociatedObject(self, @selector(af_notificationObserver));
        if (notificationObserver == nil) {
            notificationObserver = [[AFRefreshControlNotificationObserver alloc] initWithActivityRefreshControl:self];
            objc_setAssociatedObject(self, @selector(af_notificationObserver), notificationObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        }
        return notificationObserver;
    }
    
    // 初始化观察者类
    - (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl
    {
        self = [super init];
        if (self) {
            _refreshControl = refreshControl;
        }
        return self;
    }
    

    接口的转发实现

    转发实现主要采用下面这个方法

    - (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task {
        [[self af_notificationObserver] setRefreshingWithStateOfTask:task];
    }
    

    这就转发到了观察者类中进行了实现。

    - (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task {
        NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    
        [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil];
        [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil];
        [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil];
    
        if (task) {
            UIRefreshControl *refreshControl = self.refreshControl;
            if (task.state == NSURLSessionTaskStateRunning) {
                [refreshControl beginRefreshing];
    
                [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingTaskDidResumeNotification object:task];
                [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidCompleteNotification object:task];
                [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidSuspendNotification object:task];
            } else {
                [refreshControl endRefreshing];
            }
        }
    }
    

    这里首先移除了开始、暂停和完成的通知,然后进行了判断,如果任务存在,且任务的状态正在运行,那么就添加开始、暂停和完成的通知。如果任务的状态不是在运行,那么就调用方法停止刷新[refreshControl endRefreshing]

    下面看那几个通知实现的方法。

    - (void)af_beginRefreshing {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.refreshControl beginRefreshing];
        });
    }
    
    - (void)af_endRefreshing {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.refreshControl endRefreshing];
        });
    }
    

    后记

    本篇主要讲述了UIRefreshControl+AFNetworking这个分类,将刷新状态和任务状态进行了绑定和同步。

    相关文章

      网友评论

        本文标题:AFNetworking源码探究(二十五) —— UIKit相关

        本文链接:https://www.haomeiwen.com/subject/vitqfftx.html