iOS 等待异步线程结束再执行后续代码

今天遇到一个关于蓝牙传值方法的问题,我将蓝牙通讯模块封装到了一个工具类中,另外我定义了一个Block代码块当我从外部向蓝牙发送了一个数据的时候我要用定义的block代码块返回给外部调用者。但是外部调用者却要在block代码块外使用这个数据。例如一个Demo代码如下:

#import "ViewController.h"

typedef void(^SuccessBlock)(NSString *Obj);

@interface ViewController ()

@property (nonatomic, weak) SuccessBlock    successBlock;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self getADataFromOtherOperationQueue:^(NSString *Obj) {

        NSLog(@"%@",Obj);

    }];

    NSLog(@"22222222222222222");
}

- (void)getADataFromOtherOperationQueue:(SuccessBlock)successBlock
{
    self.successBlock = successBlock;

    [self performSelector:@selector(setADataToOtherOperationQueue) withObject:nil afterDelay:5.0];

}

- (void)setADataToOtherOperationQueue
{
    self.successBlock(@"11111111111111111");
}

打印结果总是难以避免是下面这种,哪怕我加了锁,也不行。

22222222222222222
11111111111111111

后来经过搜索发现一个方法很不错:

#import "ViewController.h"

typedef void(^SuccessBlock)(NSString *Obj);

@interface ViewController ()

@property (nonatomic, weak) SuccessBlock    successBlock;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self getADataFromOtherOperationQueue:^(NSString *Obj) {

        //这里改变RunLoop模式
        CFRunLoopStop(CFRunLoopGetMain());

        NSLog(@"%@",Obj);
    }];

    //这里恢复RunLoop
    CFRunLoopRun();


    NSLog(@"22222222222222222");
}

- (void)getADataFromOtherOperationQueue:(SuccessBlock)successBlock
{
    self.successBlock = successBlock;

    [self performSelector:@selector(setADataToOtherOperationQueue) withObject:nil afterDelay:5.0];

}

- (void)setADataToOtherOperationQueue
{
    self.successBlock(@"11111111111111111");
}

打印结果:

11111111111111111
22222222222222222

我的问题瞬间就解决了,very good!!!

另外非常感谢大神的分享
原文链接: iOS 异步请求等待传值方法小结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值