美文网首页
部分第三方实现原理

部分第三方实现原理

作者: QYCD | 来源:发表于2021-10-13 17:31 被阅读0次
    AFNetworking
    image.png image.png

    AFNetworking是封装的NSURLSession的网络请求
    由五个模块组成:

    • NSURLSession, 网络通信模块对应AFNetworking中的AFURLSessionManager和对HTTP协议进行特化处理的AFHTTPSessionManager, AFHTTPSessionManager继承自AFURLSessionManager
    • Reachability, 网络状态监听模块,对应AFNetworkReachabilityManager
    • Security, 网络通讯安全策略模块 对应AFSecurityPolicy
    • Serialization, 网络通信信息序列化、反序列化模块,对应AFURLRequestSerialization和AFURLResponseSerialization
    • UIKit, 对于UIKit的扩展

    序列化: 将数据结构或对象转换成二进制串的过程
    反序列化: 将在序列化过程中所生产的二进制串转换成数据对象或者对象的过程

    SDWebImage
    1. sd_setImageWithURL:placeholderImage:先把placeholderImage显示
    2. 根据图片URL处理图片,从缓存中查找是否有图片,如果已经存在图片缓存,则直接展示
    3. 若内存缓存中没有,从磁盘中查找是否有图片缓存,如果存在,将图片添加到内存缓存中,进而展示
    4. 若磁盘缓存没有,则开始下载图片
    5. 下载完成后展示图片,并保存到内存缓存和磁盘缓存中
    Masonry

    Masonry是一个对系统NSLayoutConstraint进行封装的第三方自动布局框架,链式编程的方式提供给开发者APi。相对于系统NSLayoutConstraint,布局代码简洁易懂。
    支持iOS和Mac两个平台
    看源码中View+MASAdditions文件,其对iOS平台的UIView进行了分类扩展

    #if TARGET_OS_IPHONE || TARGET_OS_TV
    
        #import <UIKit/UIKit.h>
        #define MAS_VIEW UIView
        #define MAS_VIEW_CONTROLLER UIViewController
        #define MASEdgeInsets UIEdgeInsets
    
        typedef UILayoutPriority MASLayoutPriority;
        static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
        static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
        static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
        static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
        static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;
    
    #elif TARGET_OS_MAC
    
        #import <AppKit/AppKit.h>
        #define MAS_VIEW NSView
        #define MASEdgeInsets NSEdgeInsets
    
        typedef NSLayoutPriority MASLayoutPriority;
        static const MASLayoutPriority MASLayoutPriorityRequired = NSLayoutPriorityRequired;
        static const MASLayoutPriority MASLayoutPriorityDefaultHigh = NSLayoutPriorityDefaultHigh;
        static const MASLayoutPriority MASLayoutPriorityDragThatCanResizeWindow = NSLayoutPriorityDragThatCanResizeWindow;
        static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 501;
        static const MASLayoutPriority MASLayoutPriorityWindowSizeStayPut = NSLayoutPriorityWindowSizeStayPut;
        static const MASLayoutPriority MASLayoutPriorityDragThatCannotResizeWindow = NSLayoutPriorityDragThatCannotResizeWindow;
        static const MASLayoutPriority MASLayoutPriorityDefaultLow = NSLayoutPriorityDefaultLow;
        static const MASLayoutPriority MASLayoutPriorityFittingSizeCompression = NSLayoutPriorityFittingSizeCompression;
    
    #endif
    
    @interface MAS_VIEW (MASAdditions)
    
    /**
     *  following properties return a new MASViewAttribute with current view and appropriate NSLayoutAttribute
     */
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_left;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_top;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_right;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottom;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_leading;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_trailing;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_width;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_height;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_centerX;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_centerY;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_baseline;
    @property (nonatomic, strong, readonly) MASViewAttribute *(^mas_attribute)(NSLayoutAttribute attr);
    
    #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
    
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_firstBaseline;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_lastBaseline;
    
    #endif
    
    #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)
    
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_leftMargin;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_rightMargin;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_topMargin;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottomMargin;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_leadingMargin;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_trailingMargin;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_centerXWithinMargins;
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_centerYWithinMargins;
    
    #endif
    
    #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 110000) || (__TV_OS_VERSION_MAX_ALLOWED >= 110000)
    
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_safeAreaLayoutGuide API_AVAILABLE(ios(11.0),tvos(11.0));
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_safeAreaLayoutGuideTop API_AVAILABLE(ios(11.0),tvos(11.0));
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_safeAreaLayoutGuideBottom API_AVAILABLE(ios(11.0),tvos(11.0));
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_safeAreaLayoutGuideLeft API_AVAILABLE(ios(11.0),tvos(11.0));
    @property (nonatomic, strong, readonly) MASViewAttribute *mas_safeAreaLayoutGuideRight API_AVAILABLE(ios(11.0),tvos(11.0));
    
    #endif
    
    • layoutSubviews 继承于UIView的子类重写,进行布局更新,刷新视图
    • setNeedsLayout 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,在下一轮runloop结束前刷新,layoutSubviews一定会被调用
    • layoutIfNeeded 如果有需要刷新的标记,立即调用layoutSubviews进行布局,没有标记,则不会调用layoutSubviews

    在当前runloop中立即刷新

    [self setNeedsLayout];
    [self layoutIfNeeded];
    

    Masonry更新约束产生动画效果
    需要控件的父视图layoutIfNeeded,立即刷新,否则不会产生动画效果

    self.animationView = [UIView new];
        self.animationView.backgroundColor = [UIColor orangeColor];
        [self.view addSubview:self.animationView];
        [self.animationView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.leading.equalTo(@20);
            make.top.mas_equalTo(100);
            make.size.mas_equalTo(CGSizeMake(100, 100));
        }];
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        [UIView animateWithDuration:1 animations:^{
            [self.animationView mas_updateConstraints:^(MASConstraintMaker *make) {
                make.size.mas_equalTo(CGSizeMake(200, 200));
            }];
            [self.view layoutIfNeeded];
        }];
    }
    

    iOS自动布局框架-Masonry详解
    iOS开发中使用Masonry更新约束产生动画效果

    相关文章

      网友评论

          本文标题:部分第三方实现原理

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