文章目录
在某些情况下,我们需要将block2 作为一个block1 的参数
下面简单介绍用法
定义回调
@interface ListModel : NSObject
- (void)requestWithCompletion:(void (^)(NSString * , void (^)(void)))completion;
@end
@implementation ListModel
- (void)requestWithCompletion:(void (^)(NSString * _Nonnull, void (^ _Nonnull)(void)))completion
{
completion(@"yy", ^(void) {
NSLog(@"这里是这里是是需要穿出去的block");
});
}
@end
使用
ListModel *model = [[ListModel alloc] init];
[model requestWithCompletion:^(NSString * _Nonnull, void (^ kkk)(void)) {
if (kkk) {
kkk();
}
}];
较复杂的用法
定义一个新sumBlock, 并在新sumBlock 中调用传来的completionBlock, 并把需要的回调参数bigdataBlock传给 completionBlock
//.h文件
- (void)requestVerticalVideoListWithStartId:(NSString *)startId
completion:(void (^)(NSArray <listContObjectVO *> * __nullable, NSString * __nullable message, NSString *code, void (^block)(void)))completionBlock;
//.m 文件
- (void)requestVerticalVideoListWithStartId:(NSString *)startId
completion:(void (^)(NSArray <listContObjectVO *> * __nullable, NSString * __nullable, NSString * __nullable, void (^block)(void)))completionBlock
{
NSDictionary *parameter = @{@"verticalListStartId":startId ?: @""};
[Remote postActionWithBlock:REFRESHTAG requestUrl:videoListVerticalList parameter:parameter withWaitCursor:NO completion:^(BOOL success, NSString *message, id responseData) {
[self resetReqIdWithResponse:responseData];
void (^bigdataBlock)(void) = ^(void) {
if ([self.delegate respondsToSelector:@selector(bigCreatBasisDataWhenRemoteScess:responseData:)]) {
[self.delegate bigCreatBasisDataWhenRemoteScess:self responseData:responseData];
}
};
/*注意,因为handleResponse 接收的 completionBlock 中没有block 参数,
这里就需要重新定义一个sumBlock, 在 sumBlock 回调里面,将bigdataBlock传给completionBlock,并调用 completionBlock(含有block参数),
*/
void (^sumBlock) (NSArray <listContObjectVO *> *, NSString * , NSString *) = ^(NSArray <listContObjectVO *> * __nullable array, NSString * __nullable msg, NSString * __nullable code) {
if (completionBlock) {
completionBlock(array, msg, code, bigdataBlock);
}
};
[self handleResponse:responseData
message:message
success:success
completion:sumBlock];
}];
}
///注意,该方法中 completionBlock 中没有 block参数
- (void)handleResponse:(NSDictionary *)responseData
message:(NSString *)message
success:(BOOL)success
completion:(void (^)(NSArray <listContObjectVO *> * __nullable, NSString * __nullable, NSString * __nullable))completionBlock
{
NSMutableArray *modelsArray = [NSMutableArray array];
NSString *code = [responseData tp_stringForKey:@"resultCode"];
if (success) {
self.nextUrl = [responseData tp_stringForKey:@"nextUrl"];
NSArray *array = [responseData tp_arrayForKeyPath:@"contList"];
[array enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
listContObjectVO *model = setJsonDicToDataModel(obj, [listContObjectVO class]);
[modelsArray addObject:model];
}];
}
if (completionBlock) {
completionBlock(modelsArray,message,code);
}
}
调用
[self.viewModel requestVerticalVideoListWithStartId:self.verticalListStartId completion:^(NSArray<listContObjectVO *> * __nullable array , NSString * __nullable message, NSString * __nullable code, void (^bigDataBlock)(void)) {
[weakSelf.dataArray addObjectsFromArray:array];
if (bigDataBlock) {
bigDataBlock();
}
if (array.count > 0) {
self.backBtn.hidden = YES;
self.tableView.hidden = NO;
}
[weakSelf.tableView reloadData];
if (!weakSelf.hasEnterBackground) {
[weakSelf firstPlay];
} else {
weakSelf.becomeActiveBlock = ^{
[weakSelf firstPlay];
};
}
[weakSelf stopLoading];
[weakSelf handleNodataViewWithMessage:message code:code];
}];
block 可以为空
- (void)judgeIsloginWithCompletion:(void (^) ( void (^ _Nullable block)(BOOL islogin)))completion;
void (^handleNotLoaded) (void (^)(BOOL)) = ^(void (^completion)(BOOL)) {
self.immediateUse = NO;
if (completion) {
completion(NO);
}
};
handleNotLoaded(completionBlock);
void (^handleNotLoaded) (void (^)(BOOL), BOOL) = ^(void (^completion)(BOOL), BOOL loadedSuccess) {
self.immediateUse = NO;
if (completion) {
completion(loadedSuccess);
}
};
handleNotLoaded(completionBlock, NO);