代码拉取完成,页面将自动刷新
To run the example project, clone the repo, and run pod install
from the Example directory first.
AsyncTaskTrigger is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'AsyncTaskTrigger'
// 标识任务组的唯一ID
NSString *groupKey = @"serial_group_on";
// 准备任务组 groupKey 和 任务类型 (AsyncType)
// AsyncType 串行 : LXTaskAsyncTypeSerial 并发 : LXTaskAsyncTypeConcurrent
[[AsyncTaskTrigger shareTrigger] prepareTaskGroupWithAsyncType:LXTaskAsyncTypeConcurrent groupKey:groupKey];
// 添加任务A
[trigger addTaskHandlerAction:^(LXTaskActionBlock _Nullable semaphoreHandle) {
[self actionBlockAWithComplet:^{
semaphoreHandle();
}];
} groupKey:groupKey];
// 添加任务B
[trigger addTaskHandlerAction:^(LXTaskActionBlock _Nullable semaphoreHandle) {
[self actionBlockBWithComplet:^{
semaphoreHandle();
}];
} groupKey:groupKey];
// 启动任务组内的任务
[trigger startTaskActionWithGroupKey:groupKey completBlock:^{
NSLog(@"kael -- 所有的任务都完成了");
}];
// 标识任务组的唯一ID
NSString *groupKey = @"serial_group_on";
// 准备任务组
[[AsyncTaskTrigger shareTrigger] prepareTaskGroupWithAsyncType:LXTaskAsyncTypeConcurrent groupKey:groupKey];
// 添加任务A
[trigger addTaskAction:^{
[self actionBlockAWithComplet:^{
// 需要在任务完成处 手动调用此方法!!!
[[AsyncTaskTrigger shareTrigger] sendSemaphoreToGroupKey:groupKey];
}];
} groupKey:groupKey];
// 添加任务B
[trigger addTaskAction:^{
[self actionBlockBWithComplet:^{
[[AsyncTaskTrigger shareTrigger] sendSemaphoreToGroupKey:groupKey];
}];
} groupKey:groupKey];
// 启动任务组内的任务
[trigger startTaskActionWithGroupKey:groupKey completBlock:^{
NSLog(@"kael -- 所有的任务都完成了");
}];
// ---------1、获取触发器单利
AsyncTaskTrigger *trigger = [AsyncTaskTrigger shareTrigger];
__weak typeof (&*trigger)wtrigger = trigger;
// 每一组任务 都需要有一个GroupKey
NSString *groupKey = @"serial_group_serial";
// --------添加任务A
[trigger addTaskAction:^{
// 开始执行任务A
[self actionBlockAWithComplet:^{
// 任务完成后 需要向指定 groupKey 对应的任务组 发送信号量;
[wtrigger sendSemaphoreToGroupKey:groupKey];
// 如果某些异步任务是通过代理的方式回调 可以在完成处这样标记下
// [[AsyncTaskTrigger shareTrigger]sendSemaphoreToGroupKey:groupKey];
}];
} asyncType:LXTaskAsyncTypeSerial groupKey:groupKey completBlock:^{
// 本次任务完成后的回调 --- 这里的回调是任务内的同步部分完成后的回调
// 如果是请求 代表是请求已发送 而非 请求已结束
}];
// -----------添加任务B
[trigger addTaskAction:^{
// 执行任务B
[self actionBlockBWithComplet:^{
[wtrigger sendSemaphoreToGroupKey:groupKey];
}];
} asyncType:LXTaskAsyncTypeSerial groupKey:groupKey completBlock:nil];
// Block回调发送信号量 另外一种方式
[trigger addTaskHandlerAction:^(LXTaskActionBlock _Nullable semaphoreHandle) {
[self actionBlockAWithComplet:^{
// 可以直接在这里调用这个Block即可
semaphoreHandle();
}];
} asyncType:LXTaskAsyncTypeSerial groupKey:groupKey completBlock:nil];
[trigger startTaskActionWithGroupKey:groupKey completBlock:^{
NSLog(@"kael -- 所有的任务都完成了");
}];
[trigger addTaskHandlerAction:^(LXTaskActionBlock _Nullable semaphoreHandle) {
[self actionBlockAWithComplet:^{
// 可以直接在这里调用这个Block即可
semaphoreHandle();
}];
} asyncType:LXTaskAsyncTypeSerial groupKey:groupKey];
[[AsyncTaskTrigger shareTrigger] addTaskAction:^{
// 执行任务B
[self actionBlockBWithComplet:^{
[[AsyncTaskTrigger shareTrigger] sendSemaphoreToGroupKey:groupKey];
}];
} asyncType:LXTaskAsyncTypeSerial groupKey:groupKey];
[[AsyncTaskTrigger shareTrigger] addTaskAction:^{
// 执行任务B
[self actionBlockB];
} asyncType:LXTaskAsyncTypeSerial groupKey:groupKey];
// 执行任务B 完成后的代理回调
- (void)actionCompleteHanlder {
// 需要告知触发器
[[AsyncTaskTrigger shareTrigger] sendSemaphoreToGroupKey:groupKey];
}
本工具是为了解决两类问题:
多个网络请求串行 a-->b-->c-->刷新UI
A、B、C 三个异步请求结束后,再处理数据+刷新UI 避免频繁刷新UI、避免该取数据时取不到 或者数据不全
本工具的groupKey
是一个任务组ID的概念,里面的任务必须是同一任务类型。
/// 任务类型枚举
typedef NS_ENUM(NSUInteger, LXTaskAsyncType) {
/// 串行 异步任务
LXTaskAsyncTypeSerial = 0,
/// 并发异步任务
LXTaskAsyncTypeConcurrent = 1,
};
如果过实现下面场景:A、B 异步任务并发结束后执行异步任务 C ,C任务执行完毕后再执行 并发的任务D、E,D、E任务都结束后执行任务F。
可以如此:
// 分配任务A、B到同一个任务组
- (void)firstTaskGroup {
NSString *groupKey = @"groupKey_first";
// 添加任务A
[[AsyncTaskTrigger shareTrigger] addTaskAction:^{
[self actionBlockAWithComplet:^{
[[AsyncTaskTrigger shareTrigger] sendSemaphoreToGroupKey:groupKey];
}];
} asyncType:LXTaskAsyncTypeConcurrent groupKey:groupKey completBlock:nil];
// 添加任务B
[[AsyncTaskTrigger shareTrigger] addTaskAction:^{
[self actionBlockBWithComplet:^{
[[AsyncTaskTrigger shareTrigger] sendSemaphoreToGroupKey:groupKey];
}];
} asyncType:LXTaskAsyncTypeConcurrent groupKey:groupKey completBlock:nil];
// 开启
[[AsyncTaskTrigger shareTrigger] startTaskActionWithGroupKey:groupKey completBlock:^{
// 执行任务C
[self actionBlockCWithComplet:^{
[self secondTaskGroup];
}];
}];
}
// 分配任务 D、E 到同一个任务组 最后执行F
- (void)secondTaskGroup {
// 这里一定要记得 更改任务组ID
NSString *groupKey = @"groupKey_second";
// 添加任务D
[[AsyncTaskTrigger shareTrigger] addTaskAction:^{
[self actionBlockDWithComplet:^{
[[AsyncTaskTrigger shareTrigger] sendSemaphoreToGroupKey:groupKey];
}];
} asyncType:LXTaskAsyncTypeConcurrent groupKey:groupKey completBlock:nil];
// 添加任务E
[[AsyncTaskTrigger shareTrigger] addTaskAction:^{
[self actionBlockEWithComplet:^{
[[AsyncTaskTrigger shareTrigger] sendSemaphoreToGroupKey:groupKey];
}];
} asyncType:LXTaskAsyncTypeConcurrent groupKey:groupKey completBlock:nil];
// 开启
[[AsyncTaskTrigger shareTrigger] startTaskActionWithGroupKey:groupKey completBlock:^{
// 执行任务F
[self actionBlockFWithComplet:^{
// 最终任务执行完毕
}];
}];
}
/// 添加任务
/// @param actionBlock 任务事件
/// @param asyncType 异步类型 串行 还是 并发
/// @param groupKey 任务组Key
/// @param completBlock (同步部分)任务完成后的回调
- (void)addTaskHandlerAction:(LXSemaphoreBlock)actionBlock
asyncType:(LXTaskAsyncType)asyncType
groupKey:(NSString *)groupKey
completBlock:(LXTaskActionBlock)completBlock;
/// 任务类型
typedef NS_ENUM(NSUInteger, LXTaskAsyncType) {
/// 串行 异步任务
LXTaskAsyncTypeSerial = 0,
/// 并发异步任务
LXTaskAsyncTypeConcurrent = 1,
};
Kael, zhouzuosong_kael@163.com
AsyncTaskTrigger is available under the MIT license. See the LICENSE file for more info.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。