菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
158
0

iOS promise

原创
05/13 14:22
阅读数 61702

async/await扫盲

iOS三方框架

自己实现小demo:

#import <Foundation/Foundation.h>
#import "BlockTask.h"

NS_ASSUME_NONNULL_BEGIN

typedef _Nullable id (^TBlock)(id result);

@interface TaskQueue : NSObject

@property(nonatomic,strong) NSBlockOperation * preTask;
@property(nonatomic,strong) id result;

-(TaskQueue * )awaitBlockTask:(TBlock ) block;

@end

NS_ASSUME_NONNULL_END
#import "TaskQueue.h"

@interface TaskQueue ()
@property(nonatomic,strong) NSOperationQueue * taskQueue;
@end

@implementation TaskQueue

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self initQueue];
    }
    return self;
}

-(void)initQueue{
    _taskQueue = [[NSOperationQueue alloc] init] ;
}
-(TaskQueue * )awaitBlockTask:(TBlock) block{
    __block typeof(self) weakSelf = self;
    NSBlockOperation * task = [NSBlockOperation blockOperationWithBlock:^{
        weakSelf.result =  block(weakSelf);
    }];
    if (self.preTask) {
        [task addDependency:self.preTask];
    }
    [_taskQueue addOperation:task];
    self.preTask = task;
    return self;
}

@end

测试代码,不阻塞当前线程按顺序执行:

    NSLog(@"main start");
    
    TaskQueue * queue = [[TaskQueue alloc] init];
    
    [[[[queue awaitBlockTask:^id(TaskQueue*  preTask) {
        NSLog(@"task 1 ,%@",[NSThread currentThread]);
        return @"111";
        
    }] awaitBlockTask:^id(TaskQueue*  preTask) {
        [NSThread sleepForTimeInterval:3];
        NSLog(@"task 2 ,result:%@,%@",preTask.result ,[NSThread currentThread]);
        return @"222";
        
    }] awaitBlockTask:^id(TaskQueue*  preTask) {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"task 3 ,result:%@,%@",preTask.result ,[NSThread currentThread]);
        return @"333";
        
    }] awaitBlockTask:^id(TaskQueue*  preTask) {
        NSLog(@"task 4 ,result:%@,%@",preTask.result ,[NSThread currentThread]);
        return @"444";
        
    }];
    NSLog(@"main end");

发表评论

0/200
158 点赞
0 评论
收藏