• iOS promise


    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");
    
    
    解决问题的能力很关键~(iOS开发交流群:219926126)
  • 相关阅读:
    MongoDB基础--数据库和集合基本操作
    MongoDB索引
    Spring 单元测试
    MongoDB创建索引
    MongoDB数据更新
    MongoDB基本写入和读出操作
    MongBD-windows 64-bit 安装
    Maven报错
    Converter使用及其原理
    volatile到底解决了什么问题?
  • 原文地址:https://www.cnblogs.com/qiyer/p/14675236.html
Copyright © 2020-2023  润新知