1. 记载使用ReactiveObjC
- (void)requestData {
RACSignal *signal1 = [RACSignalcreateSignal:^RACDisposable *(id subscriber) {
// 接口请求一
// ...// 发送succe或者fail数据
[subscribersendNext:@"接口数据一"];
return[RACDisposabledisposableWithBlock:^{}];
}];
RACSignal *signal2 = [RACSignalcreateSignal:^RACDisposable *(id subscriber) {
// 接口请求二
// ...// 发送succe或者fail数据
[subscribersendNext:@"接口数据二"];
return[RACDisposabledisposableWithBlock:^{}];
}];
[selfrac_liftSelector:@selector(updateUIWithData1:data2:)withSignals:signal1, signal2, nil];
}
- (void)updateUIWithData1:(id)data1data2:(id)data2{
// 当接口一, 和接口二都有sendNext时, 就会调用此方法
// 更新UI
}
2. GCD信号量 dispatch_semaphore_t
<1>dispatch_semaphore_tsemaphore = dispatch_semaphore_create(2);
这行代码创建了一个信号量,同时指明了最多有2个资源可以访问该"临界区域"
<2>dispatch_semaphore_signal(semaphore)
这行代码 提高信号量 , 信号量计数 + 1
<3>dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
这行代码 降低信号量 , 信号量计数 - 1
特别注意 当信号为0(零),在执行 dispatch_semaphore_wait 语句时,信号量计数小于0 ,阻塞当前线程.
//三个网络请求使用GCD信号量实现同步,并且不阻塞主线程
- (void)text3 {
dispatch_queue_t queue = dispatch_queue_create("AAA", NULL);
dispatch_async(queue, ^{
NSLog(@"current1:%@",[NSThread currentThread]);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[ATBaseRequest getRequestWithMethod:@"https://www.apiopen.top/journalismApi" param:nil success:^(id data) {
dispatch_semaphore_signal(semaphore);
NSLog(@"1请求成功");
} failure:^(NSInteger resultId, NSString *errorMsg) {
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //等待信号,当信号总量少于0 的时候就会一直等待 ,否则就可以正常的执行,并让信号总量-1
[ATBaseRequest getRequestWithMethod:@"https://www.apiopen.top/satinApi?type=1&page=1" param:nil success:^(id data) {
dispatch_semaphore_signal(semaphore);
NSLog(@"2请求成功");
} failure:^(NSInteger resultId, NSString *errorMsg) {
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //等待信号,当信号总量少于0 的时候就会一直等待 ,否则就可以正常的执行,并让信号总量-1
[ATBaseRequest getRequestWithMethod:@"https://www.apiopen.top/satinCommentApi?id=27610708&page=1" param:nil success:^(id data) {
NSLog(@"3请求成功");
} failure:^(NSInteger resultId, NSString *errorMsg) {
}];
});
}
3.假如现在有一个这样的需求,需要先下载50张图片, 一般异步会开启新的线程,但过多的线程 数与项目的性能是成反比的 . 所以控制并发,提高性能则尤为重要 : 实例代码如下
- (void)testGCD3{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);//创建计数为5的信号量
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i=0;i<100 ; i++) {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//当i==5时,信号量计数<0了,for循环线程阻塞,不继续执行for循环里面同一线程的代码,等到前面5次异步执行完毕,信号量就会增加,紧接着继续执行for循环从而保证控制最大并发量的效果
dispatch_async(queue, ^{
NSLog(@"i = %d",i);
//此处模拟一个 异步下载图片的操作
sleep(2);
dispatch_semaphore_signal(semaphore);
});
}
}