iOS事件有序處理引谜,比如首頁彈窗

//效果


node.gif

//今天看到一篇文章試著寫了下哄褒。https://blog.csdn.net/u014626094/article/details/101697305

#import <Foundation/Foundation.h>

typedef void (^Block)(NSInteger note_id) ;
NS_ASSUME_NONNULL_BEGIN
@protocol Node <NSObject>

- (NSInteger)getId;

- (void)onCompleted:(NSInteger)note_id;

@end

@interface WorkNode : NSObject<Node>

@property (nonatomic, assign) BOOL isWorking; //!<


@property (nonatomic, strong) id data;

@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 <Node>))block;

- (void)doWork:(Block)block;

@end


@interface MKWorkFlowManager : NSObject
- (instancetype)initWithWorks:(NSMutableArray *)works ;
- (void)addNode:(id<Node>)node;


- (void)startWorking;

- (void)pauseExecuteAction;

- (void)startExecuteAction:(NSInteger)node_id;
@end

NS_ASSUME_NONNULL_END

////////////////////////////////////////////


#import "MKWorkFlowManager.h"

@interface WorkNode ()
@property (nonatomic, copy) void (^workBlock)(id <Node>); //!<
@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 <Node>))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:(NSInteger)note_id {
    
    if (_onWorkCompleted) {
        _onWorkCompleted(note_id);
    }
}

@end

@interface MKWorkFlowManager ()
@property (nonatomic, strong) NSMutableArray *nodes; //!<
@property (nonatomic, assign) BOOL isExecuteAction; //!<
@property (nonatomic, assign) BOOL canExecute; //!<
@end

@implementation MKWorkFlowManager
- (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 executeNextNodeWithNodeId:node.nodeID];
//            }else{
//                 [self findAndExecuteNextNode];
//            }
//        }
//    }

   
}

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

- (void)pauseExecuteAction {
    _canExecute = NO;
}

- (void)startExecuteAction:(NSInteger)node_id {
    
    if (!_canExecute) {
        _canExecute = YES;
    }
    
    if (node_id == 0) {
       [self findAndExecuteNextNode];
    }else{
       [self executeNextNodeWithNodeId:node_id];
    }
    
}

- (void)startWorking {
    [self findAndExecuteNextNode];
}


- (void)findAndExecuteNextNode {

    if ([self hasWorkingNode]) {
        NSLog(@"還有任務在執(zhí)行");
        return;
    }
    
    if (self.nodes.count >0 && self.canExecute == YES) {
        WorkNode *worknode = self.nodes.firstObject;
        
        worknode.isWorking = YES;
        
        [worknode doWork:^(NSInteger note_id){
            [self.nodes removeObject:worknode];
        
            if (note_id == 0) {
                [self findAndExecuteNextNode];
            }else{
                [self executeNextNodeWithNodeId:note_id];
            }
        }];
        
//        [self hasStartNode];
    }
    
}




//這個方法優(yōu)先級高點煌张,即時被中斷也執(zhí)行
- (void)executeNextNodeWithNodeId:(NSInteger)node_id {


    if ([self hasWorkingNode]) {
        NSLog(@"還有任務在執(zhí)行");
        return;
    }
    
    if (self.nodes.count >0) {
        
        BOOL hasFind = NO;
        
        for (WorkNode *node in self.nodes) {
            
            
            
            if (node.nodeID == node_id) {
                WorkNode *worknode = node;
                node.isWorking = YES;
                
                kWeakSelf;
                [worknode doWork:^(NSInteger note_id){
                    kStrongSelf;
                    [strongSelf.nodes removeObject:worknode];
                
                    if (strongSelf.canExecute) {
                        if (note_id == 0) {
                            [strongSelf findAndExecuteNextNode];
                        }else{
                            [strongSelf executeNextNodeWithNodeId:note_id];
                        }
                    }

                }];
                
                hasFind = YES;
                
//                [self hasStartNode];
                
                break;
            }
        }
        
        if (hasFind != YES) {
            [self findAndExecuteNextNode];
        }

    }
}


- (BOOL)hasWorkingNode{
    BOOL hasWoringNode = NO;
    for (WorkNode *node in self.nodes) {
        if (node.isWorking) {
            hasWoringNode = YES;
            break;
        }
    }
    return hasWoringNode;
}


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

@end



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呐赡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骏融,更是在濱河造成了極大的恐慌,老刑警劉巖档玻,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怀泊,死亡現(xiàn)場離奇詭異,居然都是意外死亡误趴,警方通過查閱死者的電腦和手機霹琼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凉当,“玉大人枣申,你說我怎么就攤上這事】春迹” “怎么了忠藤?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長楼雹。 經(jīng)常有香客問我模孩,道長,這世上最難降的妖魔是什么贮缅? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任榨咐,我火速辦了婚禮,結(jié)果婚禮上谴供,老公的妹妹穿的比我還像新娘块茁。我一直安慰自己,他們只是感情好憔鬼,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布龟劲。 她就那樣靜靜地躺著,像睡著了一般轴或。 火紅的嫁衣襯著肌膚如雪昌跌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天照雁,我揣著相機與錄音蚕愤,去河邊找鬼。 笑死饺蚊,一個胖子當著我的面吹牛萍诱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播污呼,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼裕坊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了燕酷?” 一聲冷哼從身側(cè)響起籍凝,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苗缩,沒想到半個月后饵蒂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡酱讶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年退盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泻肯。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡渊迁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灶挟,到底是詐尸還是另有隱情宫纬,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布膏萧,位于F島的核電站漓骚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏榛泛。R本人自食惡果不足惜蝌蹂,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曹锨。 院中可真熱鬧孤个,春花似錦、人聲如沸沛简。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至给郊,卻和暖如春牡肉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淆九。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工统锤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炭庙。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓饲窿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親焕蹄。 傳聞我的和親對象是個殘疾皇子逾雄,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359