三方库的使用




AFNetworking

#import "AFNetworking.h"//主要用于网络请求方法
#import "UIKit+AFNetworking.h"//里面有异步加载图片的方法


基本使用格式:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

/** AFHTTPSessionManager单例类对象的配置 */
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; //表示不做SSL pinning

manager.responseSerializer = [AFJSONResponseSerializer serializer];//响应类型:Json类型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html",@"text/heml", nil]; //支持的类型 

 
manager.requestSerializer.timeoutInterval = 6; //请求超时

[manager GET:urlStr parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"JSON DATA: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"Error: %@", error);
}];


进行再封装时,可配合block的使用!参考:《Block使用 配合网络请求(AFNetworking)》。


详细参考:《AFNetworking的介绍与使用





Masonry

#import "Masonry.h"


基本使用方法:
  • 新增 约束 :- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;

    [  mas_makeConstraints:^(MASConstraintMaker *make) { 
      //只负责新增约束(与Autolayout不能同时存在)
    
    }];
    


  • 清除 约束 :- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;

    [  mas_updateConstraints:^(MASConstraintMaker *make) { //
      //清除 之前的所有约束,仅保留最新的约束
    
    }];
    


  • 更新 约束 :- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;

    [  mas_remakeConstraints:^(MASConstraintMaker *make) {
       //更新  在block中出现的约束,不会导致出现两个相同约束的情况
    
    }];
    





SDWebImage

#import "UIImageView+WebCache.h"//SDWebImage缓存
#import <SDWebImage/UIButton+WebCache.h>//处理按钮的图片


基本使用方法:
NSString * picUrlStr = @"http://www.domain.com/path/pics/blabla_1.jpg";//图片的地址

[_imgView sd_setImageWithURL:[NSURL URLWithString: picUrlStr] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
//占位图片的名称:“placeholder.png”


详细参考:《iOS图片加载框架-SDWebImage解读





数据解析

  • YYModel
    #import "YYModel.h"
    


    基本使用方法:
    模型类UserInfoLogModel


    "UserInfoLogModel.h"定义:

    @interface UserInfoLogModel : BaseModel //继承自 基础模型类
    


    基础模型类 BaseModel
    #import "YYModel.h"
    @interface BaseModel : NSObject <YYModel> //遵守YYModel协议
    


    UserInfoLogModel的使用 :

    NSDictionary * jsonDict = responseObject[@"DataList"];
    // 将 JSON数据(NSData,NSString,NSDictionary) 转换为 Model
    UserInfoLogModel * userInfoModel = [UserInfoLogModel yy_modelWithJSON:jsonDict ];
    





展示例子🌰

DetailsOfDiscussModel类:
JSONKey值 与 对应Model属性名 不同(改变 JSON的Key对应的Model属性名);
Model的属性含 容器类型


DetailsOfDiscussModel.h:
#import "BaseModel.h"

@interface DetailsOfDiscussModel : BaseModel

@property (nonatomic,strong) NSString * content; //内容
@property (nonatomic,strong) NSString * _id;//⭐️⭐️⭐️改变 JSON的Key对应的Model属性名⭐️⭐️⭐️

@property (nonatomic,copy) NSArray * members;//⭐️⭐️⭐️含容器类型⭐️⭐️⭐️

@property (nonatomic,strong) NSString * topic; //主题

@end



@interface DiscussMemberModel : BaseModel

@property(nonatomic,copy) NSString * avatar;    //头像
@property(nonatomic,copy) NSString * cityCode;  //城市码
@property(nonatomic,copy) NSString * cityName;  //城市名
@property(nonatomic,copy) NSString * countyCode;//区市码
@property(nonatomic,copy) NSString * countyName;//区市名
@property(nonatomic,copy) NSString * mobile;//手机号
@property(nonatomic,copy) NSString * userId;    //用户id
@property(nonatomic,copy) NSString * userName;  //用户名

@end

DetailsOfDiscussModel.m:
#import "DetailsOfDiscussModel.h"

@implementation DetailsOfDiscussModel

//返回一个Dict,Model属性名 和 映射到JSON的Key。
+ (NSDictionary *)modelCustomPropertyMapper {
   return @{
          @"_id" : @"id" //⭐️⭐️⭐️改变 JSON的Key对应的Model属性名⭐️⭐️⭐️
          };
}

//返回一个Dict,Model属性名 和 Model属性容器中需要存放的对象类型
+ (NSDictionary *)modelContainerPropertyGenericClass
{
    return @{@"members":[DiscussMemberModel class]}; //⭐️⭐️⭐️含容器类型⭐️⭐️⭐️
}
  
@end



@implementation DiscussMemberModel //仅仅实现就好了

@end



详细参考:《YYModel 简介与使用




  • JSONModel
    #import "JSONModel.h"
    


    基本使用方法:
    模型类UserInfoLogModel


    "UserInfoLogModel.h"定义:

     @interface UserInfoLogModel : JSONModel //继承自 JSONModel类
    


    UserInfoLogModel的使用 :

    NSDictionary * jsonDict = responseObject[@"DataList"];
    NSError* err = nil;
    UserInfoLogModel * userInfoModel = [[UserInfoLogModel alloc] initWithDictionary:jsonDict error:&err];
    





IQKeyboardManager

#import "IQKeyboardManager.h"    


基本使用方法:
//IQKeyboardManager单例类对象
IQKeyboardManager *manager = [IQKeyboardManager sharedManager]; 


//关闭功能 设置为YES  (默认值为NO)
manager.enable = YES;

//点击空白区域键盘收缩 的开关   (默认值为NO)
manager.shouldResignOnTouchOutside = YES;

//是否显示它自带键盘工具条 的开关  (默认值为YES)
manager.enableAutoToolbar = NO;

当某一个特定输入框(_editTF) 不需要使用键盘上的工具条时:
_editTF.inputAccessoryView = [[UIView alloc] init];


需要在页面里,禁止自动键盘处理的事件:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[IQKeyboardManager sharedManager] setEnable:NO];
}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [[IQKeyboardManager sharedManager] setEnable:YES];
}





MJRefresh

#import "MJRefresh.h"


基本使用方法:

直接定义tableView的header、footer:(mj_headermj_footer)

self.discussListTabV.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
    //下拉更新    (网络请求)
    [self getDataWith:10 and:0]; 
}];
self.discussListTabV.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
    //上拉刷新    (网络请求)
    [self getDataWith:10 and:(int)self.dataArray.count]; 
}];


//显示 “上拉刷新”  (初次)
self.discussListTabV.mj_footer.hidden = NO; //显示(“上拉刷新”) 底部的“mj_footer”  


隐藏显示 底部的“mj_footer”(“上拉刷新”) 的情况:

//上、下滑动tableView时,显示(“上拉刷新”) 底部的“mj_footer”
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    //可判断“是否已经请求完数据??”,再来设置显示与否!

    self.discussListTabV.mj_footer.hidden = NO; //显示(“上拉刷新”) 底部的“mj_footer”
}

//网请成功
 dispatch_async(dispatch_get_main_queue(), ^{ //停止刷新
   [self.discussListTabV.mj_header endRefreshing];
   [self.discussListTabV.mj_footer endRefreshing];

   self.discussListTabV.mj_footer.hidden = YES; //隐藏(“上拉刷新”) 底部的“mj_footer”
});

//网请失败
dispatch_async(dispatch_get_main_queue(), ^{
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeText;
    hud.label.text = [error localizedDescription]; //显示报错信息
    hud.margin = 10.f;
    hud.offset = CGPointMake(0, 0.f);
    hud.removeFromSuperViewOnHide = YES;
    [hud hideAnimated:YES afterDelay:1.5f];
    hud.userInteractionEnabled = NO;
            
    self.discussListTabV.mj_footer.hidden = NO;//显示(“上拉刷新”) 底部的“mj_footer”
});





进度指示器(“菊花转”)

  • SVProgressHUD
基本使用方法:
+ (void)setBackgroundColor:(UIColor*)color; //背景颜色 (默认:白色)
+ (void)setForegroundColor:(UIColor*)color; //progress和label的颜色


//图片记住要渲染!!
+ (void)setInfoImage:(UIImage*)image; //消息的图片  
+ (void)setSuccessImage:(UIImage*)image; //成功时的图片 
+ (void)setErrorImage:(UIImage*)image; //失败时的图片


+ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; //HUD的显示模式
    / **
     SVProgressHUDMaskTypeNone = 1,  // 允许用户进行其他操作
     SVProgressHUDMaskTypeClear,     // 不允许用户进行其他操作
     SVProgressHUDMaskTypeBlack,     // 不允许用户进行其他操作,且背景为黑色
     SVProgressHUDMaskTypeGradient   // 允许用户进行其他操作,且背景是渐变的黑色
    * /



+ (void)show; //显示加载框:一个迅速转动的圈

+ (void)showWithStatus:(NSString*)status; //显示加载框,并且带着文字
+ (void)setStatus:(NSString*)string; //改变正在显示HUD上的文字

+ (void)showProgress:(float)progress;  //显示进度框:一个进度圈

+ (void)showImage:(UIImage*)image status:(NSString*)status; //显示 自己设置的图片(图片大小:28px * 28px)


+ (void)dismiss; //让进度框消失

 

+ (void)setOffsetFromCenter:(UIOffset)offset; //距离中心点的偏移量
+ (void)resetOffsetFromCenter; //返回中心点


+ (void)showSuccessWithStatus:(NSString*)string; //显示成功的消息提示
+ (void)showErrorWithStatus:(NSString *)string; //显示错误的消息提示


+ (BOOL)isVisible; //监测:是否正在显示


延时停止“菊花转”
  • 延时0.6s,执行 停止方法

    [SVProgressHUD showWithStatus:NSLocaString(@"加载中……")];
    
    //延时0.6s,停止“活动指示器”
    [self performSelector:@selector(progressDelayDismiss) withObject:nil afterDelay:0.6f];  
    
       
    -(void)progressDelayDismiss {  // 停止“活动指示器”
       [SVProgressHUD dismiss];
    }
    


  • 使用GCD延时0.6s,隐藏SVProgressHUD单例类

    //SVProgressHUD偏移位置
    [SVProgressHUD setOffsetFromCenter:UIOffsetMake(0, 0)];
    
    [SVProgressHUD showWithStatus:NSLocaString(@"加载中……")];
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.6f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 延迟0.6秒后消失
        [SVProgressHUD dismiss];
    });
    



  • MBProgressHUD
基本使用方法:
  • 只显示文字:

    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; //定义及加载到的视图
    hud.mode = MBProgressHUDModeText; //模式:显示文字
    hud.label.text = @"不能拨号!"; //显示的文字
    hud.margin = 10.f; //hud内部视图相对于hud的内边距
    hud.offset = CGPointMake(0, 0.f); //hud的偏移量
    
    hud.removeFromSuperViewOnHide = YES;
    [hud hideAnimated:YES afterDelay:1.5f]; //1.5s后移除掉hud
    hud.userInteractionEnabled = NO; //hud显示期间,其父视图 不可用户交互!
    


  • 加载动画:旋转加载圈

    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    
    hud.mode = MBProgressHUDModeCustomView; //自定义视图
    UIImage * image = [[UIImage imageNamed:@"01"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    UIImageView *imgView = [[UIImageView alloc] initWithImage:image]; //渲染好的图片
    CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
    anima.toValue = @(M_PI*2);
    anima.duration = 1.0f;
    anima.repeatCount = 10;
    [imgView.layer addAnimation:anima forKey:nil]; //layer层动画
    hud.customView = imgView;
    
    //加上 加载文字
    hud.mode = MBProgressHUDModeText; //显示文字
    hud.label.text = @"加载中……";
    hud.margin = 10.f;
    hud.offset = CGPointMake(0, -100.f);
    hud.removeFromSuperViewOnHide = YES;
    [hud hideAnimated:YES afterDelay:1.5f]; //显示周期
    



更多,参考《源码笔记---MBProgressHUD





SDCycleScrollView

#import <SDCycleScrollView.h>//无限轮播





SKPSMTPMessage

cocoaPods导入:pod 'skpsmtpmessage' #邮件发送

#import "SKPSMTPMessage.h"          //邮件
#import "NSData+Base64Additions.h"  //邮件












参考
三方库大全》:各种三方库的介绍!
CocoaPods》:CocoaPods介绍和使用
Cocoapods导入 常用第三方库》:使用Cocoapods导入三方库
三方库 mistake》:三方库使用的问题及解决

文章持续更新中~~
总结的文章全部分开了,以便总结!






goyohol's essay

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容