作者:路边一烧饼 | 来源:互联网 | 2023-09-04 17:15
今天遇到一个关于蓝牙传值方法的问题,我将蓝牙通讯模块封装到了一个工具类中,另外我定义了一个Block代码块当我从外部向蓝牙发送了一个数据的时候我要用定义的block代码块返回给外部调用者。但是外
今天遇到一个关于蓝牙传值方法的问题,我将蓝牙通讯模块封装到了一个工具类中,另外我定义了一个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) {
CFRunLoopStop(CFRunLoopGetMain());
NSLog(@"%@",Obj);
}];
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 异步请求等待传值方法小结