美文网首页
RunLoop的实际运用

RunLoop的实际运用

作者: 御雪飞斐 | 来源:发表于2019-03-26 14:51 被阅读0次

.h代码:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

__attribute__((objc_subclassing_restricted))
@interface RLTransaction : NSObject

+ (void)commitAction:(void (^)(void))action;

@end

NS_ASSUME_NONNULL_END

.m代码:

#import "RLTransaction.h"


@interface RLTransaction ()
@property (nonatomic, copy) void (^action)(void);
@end


static NSMutableArray *g_transactionArray = nil;
static dispatch_queue_t g_actionQueue = nil;

static void RLTransactionSetup()
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        g_transactionArray = @[].mutableCopy;
        g_actionQueue = dispatch_queue_create("action_queue", NULL);
        CFRunLoopRef runloop = CFRunLoopGetMain();
        CFRunLoopObserverRef observer;
        
        observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),
                                                      kCFRunLoopBeforeWaiting | kCFRunLoopExit,
                                                      true,
                                                      0xFFFFFF,
                                                      ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity)
        {
          if (g_transactionArray.count == 0)
              return;
          
            dispatch_sync(g_actionQueue, ^{
                NSArray *tasks = g_transactionArray.copy;
                [g_transactionArray removeAllObjects];
                
                [tasks enumerateObjectsUsingBlock:^(RLTransaction *obj, NSUInteger idx, BOOL * stop) {
                    obj.action();
                }];
            });
        });
        
        CFRunLoopAddObserver(runloop, observer, kCFRunLoopCommonModes);
        CFRelease(observer);
    });
}


@implementation RLTransaction

+ (void)commitAction:(void (^)(void))action
{
    RLTransaction *transaction =  [RLTransaction new];
    transaction.action = action;
    RLTransactionSetup();
    [g_transactionArray addObject:transaction];
}

@end

相关文章

  • RunLoop的实际运用

    .h代码: .m代码:

  • iOS之RunLoop详解与实践

    目录 -RunLoop的概念 -RunLoop逻辑与实现 -RunLoop在iOS中运用 -RunLoop实践 -...

  • RunLoop -- 相关问题的总结

    1、RunLoop在实际场景的应用 RunLoop -- 在实际开发中的应用 2、RunLoop内部实现逻辑 Ru...

  • RunLoop

    RunLoop RunLoop概述 什么是RunLoop RunLoop从字面意思看是运行循环,跑圈的意思,实际苹...

  • Runloop

    Runloop 实现原理及应用iOS - RunLoop 底层源码详解及具体运用

  • RunLoop

    RunLoop思考 讲讲RunLoop,项目中实际应用? RunLoop内部实现逻辑以及数据结构? RunLoop...

  • Runloop的实际应用

    1. 使用定时器 2. 延迟执行 列表上的图片在列表滑动的时候不进行加载 3. 线程保活 4. 监听卡顿 iOS开...

  • iOS Runloop底层详解

    一 什么是Runloop 二 Runloop的运行逻辑 三 Runloop在实际开发中的应用 一 什么是Runlo...

  • Runloop总结

    深入理解RunLoopMac&iOS之多线程CFRunLoop运用 RunLoop 的概念 runloop是一个对...

  • iOS Runloop面试题(AFNetworking 中如何运

    AFNetworking 中如何运用 Runloop? AFURLConnectionOperation 这个类是...

网友评论

      本文标题:RunLoop的实际运用

      本文链接:https://www.haomeiwen.com/subject/ncigvqtx.html