我们集成第三方框架的时候,可以将第三方框架的压缩包下载直接导入文件夹,或者是使用CocoaPods的方式进行集成,电脑一般是没有配置CocoaPods环境的,现在开始配置一下CocoaPods的环境配置
输入完密码之后就可以等待下载安装了
不懂安装的也可以参考这篇文章https://www.jianshu.com/p/dbfdece084d5
安装好CocoaPods之后,切换到需要引入第三方库的文件夹,然后使用pod init命名,创建podfile文件,然后在里面填写需要pod的第三方库
1)在Xcode14当中pod init的时候会出现如下错误
解决方案点击Targets 右边的第一个选项,选择13.0-compatible
2)在编译的时候会报如下错误
虽然说我们已经pod成功了第三方库,但是编译的时候还是会报错 找不到这个库,此时需要将项目的名字转换成全部都是英文的名字,不含有中文。
1)ios中著名的网络图片处理框架
2)包含的功能:图片下载、图片缓存(内存缓存和磁盘缓存)、下载进度监听、gif处理等等
3)用法极其简单、功能十分强大,大大提高了网络图片处理效率
GitHub - SDWebImage/SDWebImage: Asynchronous image downloader with cache support as a UIImageView category
可以使用3种方式来进行下载
1)进入上面的网址,点击clone,下载zip压缩包
2)使用git命令
git clone --recursive https://github.com/rs/SDWebImage.git
3)使用pod
切换到项目文件夹下,然后使用pod init命令创建一个Podfile的文本
然后在这个里面添加pod 'SDWebImage'进行导入
然后使用pod install命令进行安装就可以。
1.导入下面的头文件
#import "UIImageView+WebCache.h"
#import "SDWebImageDownloader.h"
2.直接给UIImageView对象使用sd_setImageWithURL方法
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
imageView.backgroundColor = [UIColor redColor];
[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://www.wanandroid.com/blogimgs/42da12d8-de56-4439-b40c-eab66c227a4b.png"]];
NSLog(@"%@",NSHomeDirectory());
[self.view addSubview:imageView];
}
3.就可以将图片加载下来了
4.在文件中生成的是32位的图片名称,用的是MD5算法,为了防止重名
第三方崩溃日志分析,集成Bugly
腾讯Bugly - 一种愉悦的开发方式 _android anr_android anr分析_iOS崩溃日志分析平台
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc]init];
self.window.rootViewController = [[ViewController alloc]init];
[self.window makeKeyAndVisible];
BuglyConfig *config = [[BuglyConfig alloc]init];
config.debugMode = YES;
config.blockMonitorEnable = YES;
//设置被卡住的阀值时间,当停留时间>阀值时间时,它将记录一个事件,并在应用程序下次启动时报告数据,默认值为3.5秒
config.blockMonitorTimeout = 1.5;
config.channel = @"Bugly";
config.delegate = self;
config.consolelogEnable = NO;
config.viewControllerTrackingEnable = NO;
[Bugly startWithAppId:@"8e889963d5"
#if DEBUG
developmentDevice:YES
#endif
config:config];
return YES;
}
完成它的代理
- (NSString *)attachmentForException:(NSException *)exception {
//(文件:行号 方法 == 崩溃原因)
NSLog(@"(%@:%d)------%s=====%@",[[NSString stringWithUTF8String:__FILE__] lastPathComponent],__LINE__,__PRETTY_FUNCTION__,exception);
return @"This is an attachment";
}
当点击按钮,数组越界时,刷新Bugly后台可以看到报错的具体位置
这个就是Bugly的简单使用,如果有不清楚的地方可以参考这篇文章
iOS 利用腾讯 Bugly 程序调试 测试代码bug 卡顿等情况_张无奈的博客-CSDN博客
ReactiveCocoa基本使用详解_风流 少年的博客-CSDN博客
Hook(钩子),是改变程序运行流程的一种技术。
ReactiveCocoa运行的是Hook技术,就是一种改变API程序结果的技术,在每次执行API结果之前,先执行你自己的想法,也就意味着可以对源程序进行修改,从而达到改变结果输出的目的
1)创建一个pod文件
pod init
2)导入RAC
a.纯oc项目使用
pod "ReactiveObjC"
b.oc和swift混合项目
pod "ReactiveObjC"
pod "ReactiveCocoa"
pod "ReactiveObjCBridge"
c.纯swift项目
pod "ReactiveCocoa"
3)使用arch x86_64 pod install来进行安装
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建信号
RACSignal *singal = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) {
//3.发送信号
[subscriber sendNext:@"123"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
NSLog(@"当信号发送完成或者发送失败,就会自动执行这个block,取消订阅信号");
}];
}];
//2.订阅信号
[singal subscribeNext:^(id _Nullable x) {
//发送数据,即调用sendNext时才会调用该函数
//接收到的数据
NSLog(@"接收到的数据:%@",x);
}];
}
先执行sendNext方法,然后执行subscribeNext方法,然后执行sendCompleted方法,最后执行RACDisposable方法
订阅者协议@protocol RACSubscriber
@protocol RACSubscriber
@required
- (void)sendNext:(nullable id)value;
- (void)sendError:(nullable NSError *)error;
- (void)sendCompleted;
- (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable;
@end
取消订阅,当订阅者RACSubscriber没有强引用销毁了,或者发送错误sendError,或者发送完成sendCompleted时就会执行RACDisposable关联的处理代码块:disposeBlock ,默认一个信号发送完毕就会取消订阅, 只要订阅者还存在系统就不会自动取消订阅,所以可以通过一个全局变量来强引用订阅者,这样系统就不会自动执行取消订阅的代码块
当不想监听某个信号时,可以通过调用dispose方法来主动取消订阅信号。
既能订阅信号,也能发送信号,先订阅信号,再发送信号
//1.创建信号
RACSubject *subject = [RACSubject subject];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"接收到的值:%@",x);
}];
//3.发送信号
[subject sendNext:@"123"];
@interface RACSubject
RACSubject继承自RACSubject,同时遵守RACSubscriber协议
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建信号
RACSubject *subject = [RACSubject subject];
//2.订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"订阅者1接收到的值:%@",x);
}];
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"订阅者2接收到的值:%@",x);
}];
//3.发送信号
[subject sendNext:@"123"];
[subject sendNext:@"456"];
}
subject可以订阅多个信号,但是是发送一个信号,然后这一个信号被多个订阅者订阅
123先被订阅者1订阅,然后被订阅者2订阅
既可以先订阅信号再发送信号,也可以先发送信号,再订阅信号
//1.创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject];
//2.订阅信号
// [replaySubject subscribeNext:^(id _Nullable x) {
// NSLog(@"订阅者1接收到的值:%@",x);
// }];
//3.发送信号
[replaySubject sendNext:@"123"];
[replaySubject subscribeNext:^(id _Nullable x) {
NSLog(@"订阅者1接收到的值:%@",x);
}];
@interface RACReplaySubject
这个类继承自RACSubject
RACTuple:元组,功能类似于NSArray,可以将NSArray包装成元组
RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@1,@2]];
NSLog(@"%@",tuple[0]);
RACSequence:将数组或字典转成成RACSequence,然后再转换成信号RACSignal,订阅信号就是对数组或字典进行遍历
NSArray *array = @[@1,@2,@3];
[array.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"x = %@",x);
}];
NSDictionary *dict = @{
@"username":@"zhangsan",
@"password":@"123",
};
[dict.rac_sequence.signal subscribeNext:^(id _Nullable x) {
// 通过类似于NSArray中的下标来获取
NSLog(@"key = %@ ,value = %@",x[0],x[1]);
}];
NSDictionary *dict = @{
@"username":@"zhangsan",
@"password":@"123",
};
[dict.rac_sequence.signal subscribeNext:^(id _Nullable x) {
// 使用宏函数来解析(在Erlang中称为模式匹配)
RACTupleUnpack(NSString *key,NSString *value) = x;
NSLog(@"key=%@, value=%@", key, value);
}];
当多个信号都发送了数据的时候才执行rac_liftSelector:WithSignalsFromArray
RACSignal *singal = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) {
[subscriber sendNext:@"123"];
return nil;
}];
RACSignal *singal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) {
[subscriber sendNext:@"456"];
return nil;
}];
[self rac_liftSelector:@selector(handleReceivedValue:value2:) withSignalsFromArray:@[singal,singal1]];
- (void)handleReceivedValue:(NSString *)value value2:(NSString *)value2 {
NSLog(@"value=%@, value2=%@", value, value2);
}
1)打开即时通信 IM iOS-无 UI 集成方案-文档中心-腾讯云
2)选择快速入门,选择ios集成
3)按照他的操作步骤进行注册应用,需要注意的是进行第一步登录IM控制台的时候需要进行实名认证
4)实名认证成功之后在IM控制台点击立即开始就可以注册应用了
5)点击立即开始之后是如下页面,我们创建应用名称
6)创建好应用之后可以不在进行下载源码的操作,直接点击左边的基本配置差了自己的sdkAppID和密钥,如果想要创建新的应用也可以按返回按钮进行新的应用的创建,如果想要下载源码或者是demo可以直接在上面的下载网址的里面查看就可以