iOS事件有序处理,比如首页弹窗

//效果

node.gif
//今天看到一篇文章试着写了下。https://blog.csdn.net/u014626094/article/details/101697305

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@protocol Node

  • (NSInteger)getId;

  • (void)onCompleted;

@end

NS_ASSUME_NONNULL_END

//

#import <Foundation/Foundation.h>
#import “Node.h”
#import “Work.h”

typedef void (^Block)(void) ;
NS_ASSUME_NONNULL_BEGIN

@interface WorkNode : NSObject

@property (nonatomic, assign) NSInteger nodeID; //!<

@property (nonatomic, strong) Work *work; //!<

/**

  • 当前任务完成
    */
    @property (nonatomic, copy) Block onWorkCompleted; //!<

+(WorkNode *)BuildNodeId:(NSInteger)nodeId WithWork:(Work *)work;

  • (instancetype)initNodeId:(NSInteger)nodeId WithWorkHandle:(void(^)(id ))block;

  • (void)doWork:(Block)block;

@end

NS_ASSUME_NONNULL_END

WorkNode.m

#import “WorkNode.h”
@interface WorkNode ()
@property (nonatomic, copy) void (^workBlock)(id ); //!<
@end
@implementation WorkNode

+(WorkNode *)BuildNodeId:(NSInteger)nodeId WithWork:(Work *)work {
return [[WorkNode alloc] initNodeId:nodeId WithWork:work];
}

  • (instancetype)initNodeId:(NSInteger)nodeId WithWork:(Work *)work {
    if (self = [super init]) {

      self.nodeID = nodeId;
      self.work = work;
    

    }

    return self;
    }

  • (instancetype)initNodeId:(NSInteger)nodeId WithWorkHandle:(void(^)(id ))block {
    if (self = [super init]) {

      self.nodeID = nodeId;
      self.workBlock = block;
    

    }

    return self;
    }

  • (void)doWork:(Block)block {
    _onWorkCompleted = block;
    [self.work doWork:self];
    if (_workBlock) {
    _workBlock(self);
    }
    }

  • (NSInteger)getId {

    return _nodeID;
    }

  • (void)onCompleted {
    if (_onWorkCompleted) {
    _onWorkCompleted();
    }
    }

//这东西可有可无,也可以用原文章里面的协议实现,,能力有限,后来用block写的,,

#import “Node.h”

NS_ASSUME_NONNULL_BEGIN

@interface Work : NSObject

  • (instancetype)initWithWork:(void(^)(id ))block;

  • (void)doWork:(id )node;

@end

NS_ASSUME_NONNULL_END

Work.m

@interface Work ()
@property (nonatomic, copy) void (^workBlock)(id ); //!<
@end
@implementation Work

-(instancetype)initWithWork:(void(^)(id ))block {
if (self = [super init]) {
self.workBlock = block;
}
return self;
}

  • (void)doWork:(id )node {
    if (self.workBlock) {
    self.workBlock(node);
    }
    }
    @end

#import <Foundation/Foundation.h>
#import “Node.h”
NS_ASSUME_NONNULL_BEGIN

@interface WorkFlow : NSObject

  • (instancetype)initWithWorks:(NSMutableArray *)works ;

  • (void)addNode:(id)node;

  • (void)startWithNode:(NSInteger)nodeId;

  • (void)pauseExecuteAction;

  • (void)startExecuteAction;
    @end

NS_ASSUME_NONNULL_END

// WorkFlow.m

#import “WorkFlow.h”
#import “WorkNode.h”
@interface WorkFlow ()
@property (nonatomic, strong) NSMutableArray *nodes; //!<
@property (nonatomic, assign) BOOL isExecuteAction; //!<
@property (nonatomic, assign) BOOL canExecute; //!<

@end
@implementation WorkFlow

  • (instancetype)init {
    if (self = [super init]) {
    _canExecute = YES;
    NSLog(@“initmethond”);
    }
    return self;
    }

//看情况可以设计成单例,但是也可以把初始化写到基类里面

  • (instancetype)initWithWorks:(NSMutableArray *)works {
    if (self = [super init]) {
    self.nodes = works;
    NSLog(@“initmethond1”);
    _canExecute = YES;
    }
    return self;
    }

  • (void)addNode:(WorkNode *)node {
    [self.nodes addObject:node];
    if (_canExecute == YES) {
    if (self.nodes.count == 1) {
    [self findAndExecuteNextNode];
    }else{
    if (!_isExecuteAction && self.nodes.count> 0) {
    [self startWithNode:node.nodeID];
    }else{
    [self findAndExecuteNextNode];
    NSLog(@“node----%zd”,self.nodes.count);
    }
    }
    }

}

  • (void)hasStartNode {
    NSLog(@">>>node----%zd",self.nodes.count);
    _isExecuteAction = YES;
    }

  • (void)pauseExecuteAction {
    _canExecute = NO;
    }

  • (void)startExecuteAction {
    _canExecute = YES;
    [self findAndExecuteNextNode];
    }

  • (void)startWithNode:(NSInteger)nodeId {

    for (int i = 0; i<self.nodes.count; i++) {

      WorkNode *worknode = self.nodes[i];
      if (worknode.nodeID == nodeId) {
          [worknode doWork:^{
              [self.nodes removeObject:worknode];
              [self findAndExecuteNextNode];
          }];
          
          [self hasStartNode];
          break;
      }
    

    }

}

  • (void)findAndExecuteNextNode {

    if (self.nodes.count >0 && self.canExecute == YES) {
    WorkNode *worknode = self.nodes.firstObject;

      [worknode doWork:^{
          [self.nodes removeObject:worknode];
          [self findAndExecuteNextNode];
      }];
      
      [self hasStartNode];
    

    }

}

  • (NSMutableArray *)nodes {
    if(!_nodes){
    _nodes = [NSMutableArray array];
    }
    return _nodes;
    }

@end

//使用

#import “ViewController.h”
#import “WorkNode.h”
#import “Work.h”
#import “WorkFlow.h”
@interface ViewController ()
@property (nonatomic, strong) WorkFlow *workFlow; //!<
@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSMutableArray *arr = [NSMutableArray new];
    WorkNode *node = [WorkNode BuildNodeId:12 WithWork:[[Work alloc] initWithWork:^(WorkNode * node) {

      [self doSomeThing:node];
    

    }]];

    WorkNode *node1 = [WorkNode BuildNodeId:15 WithWork:[[Work alloc] initWithWork:^(WorkNode * node) {

        [self doSomeThing:node];
    

    }]];

    WorkNode *node2 = [WorkNode BuildNodeId:18 WithWork:[[Work alloc] initWithWork:^(WorkNode * node) {

        [self doSomeThing:node];
    

    }]];

    [arr addObject:node];
    [arr addObject:node1];
    [arr addObject:node2];

// WorkFlow *workFlow = [[WorkFlow alloc] initWithWorks:arr];
WorkFlow *workFlow = [[WorkFlow alloc] init];
_workFlow = workFlow;

// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[workFlow addNode:node];

         [workFlow addNode:node1];
         [workFlow addNode:node2];

// });

}

  • (IBAction)showTime:(id)sender {
    [_workFlow startWithNode:12];
    }

  • (IBAction)addNode:(id)sender {
    static NSInteger tag = 100;

    WorkNode *node1 = [[WorkNode alloc] initNodeId:tag WithWorkHandle:^(WorkNode *tempNode) {
    [self doSomeThing:tempNode];
    }];

    [_workFlow addNode:node1];

    tag++;
    }

  • (IBAction)pauseAction:(id)sender {

    [_workFlow pauseExecuteAction];

}

  • (IBAction)startAction:(id)sender {

    [_workFlow startExecuteAction];
    }

  • (void)doSomeThing:(WorkNode *)node {
    NSLog(@">>>%zd",node.nodeID);

// @try {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@“确定要升级么?” message:nil preferredStyle:UIAlertControllerStyleActionSheet];

      UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"是" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
          NSLog(@"是按钮被点击了");
          
          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
              [node onCompleted];
          });
      }];

      

      [alertController addAction:sureAction];
    
      
      [self presentViewController:alertController animated:YES completion:nil];

// } @catch (NSException *exception) {
// NSLog(@">>>%@",exception);
// } @finally {
//
// }

}

@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值