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

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

#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

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

#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!!!oop

另外很是感谢大神的分享
原文连接: iOS 异步请求等待传值方法小结 ui