iOS 在block 回调中添加 block 作为参数

在某些情况下,我们需要将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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值