有没有在后台 dispatch_queue 上初始化 ObjC 对象的好方法?

问题描述

我有一个需要大量初始化的 ObjC 类 RuleSet(解析一个大的 JSON 文件,对多个操作系统服务进行大量查询,应用启发式,最后,它构建了一组复杂的 {{1} },稍后可用于快速评估。

我的程序(除了此对象)从 MacOS(EndpointSecurity 框架)接收高优先级事件,并且必须在非常短的期限内响应这些事件 - 基于对我当前 nspredicates 实例的快速评估。>

我在我创建的特殊(最高优先级)并发 RuleSet 中处理这些事件。

但是...如果我收到一些外部触发器,要更改我的 dispatch_queue - 并且我需要在应用它之前构建新的 RuleSet 实例,我希望创建它的代码不知道调度队列的内部结构,只需调用

RuleSet

我希望 RuleSet init 能够以某种方式将工作推迟到另一个低优先级的串行 dispatch_queue,也许是部分。我不介意在我完成之前阻止调用者(这个繁重的初始化不应该花费超过一秒钟......)。尽管如此,重要的是我在优先级较低的队列上执行此操作 - 以便首先处理传入的事件。

现在我试着写这样的东西

RuleSet *newRules = [[RuleSet alloc] initWithJSON:newJSONPath];
[myEventHandlingEngine setRuleSet:newRuleSet];

但这当然甚至不会编译,因为“self”不是 __block 变量,而且我不确定它可以是...

关于如何解决这个问题有什么建议吗?

解决方法

您应该尝试使用 dispatchGroup 来处理这种情况:

- (instancetype) initWithJSON:newJSONPath:(NSString *)jsonFilePath
{
    if ( nil == (self = [super init]) ) {
        self = nil; //This seems useless since self is already nil ?
        return self;
    }
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group,[OITPreventionPolicy policySetupQueue],^{
    
      // Execute your heavy work here

     });
     // Wait for the group to finish its work (you could replace 'forever' by a timeout)
     dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
     return self;
}

dispatch_group_wait 的调用将阻塞创建对象的线程(因此它不能是主线程)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...