问题描述
我有一个需要大量初始化的 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
的调用将阻塞创建对象的线程(因此它不能是主线程)。