概述
今天遇到一个关于蓝牙传值方法的问题,我将蓝牙通讯模块封装到了一个工具类中,另外我定义了一个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 异步请求等待传值方法小结
最后
以上就是难过小土豆为你收集整理的iOS 等待异步线程结束再执行后续代码的全部内容,希望文章能够帮你解决iOS 等待异步线程结束再执行后续代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复