我正在尝试实施dispatch_source_t
。这是我的实现:
-(void)doingSomething:(NSString*)someValue
{
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue());
dispatch_source_set_event_handler(source, ^{
NSLog(@"here %@", someValue);
NSLog(@"监听函数:%lu",dispatch_source_get_data(source));
});
dispatch_resume(source);
dispatch_source_merge_data(source, 1);
}
但是这部分实现从未执行过:
dispatch_source_set_event_handler(source, ^{
NSLog(@"here %@", someValue);
NSLog(@"监听函数:%lu",dispatch_source_get_data(source));
});
你们中的任何人都知道为什么我的代码部分永远不会被执行?
我真的很感谢你的帮助。
您不会使调度源保持活动状态。
Dispatch源实际上没有对象,它们是不透明的C数据结构。创建调度源时,必须在完成调用后调用dispatch_release(...)
,以使系统释放与之关联的内存。然而,调度源是引用计数,所以你也可以调用dispatch_retain(...)
来增加它们的引用计数,dispatch_release(...)
再次减少它,一旦它达到0,对象就会被破坏。不用说,新创建的调度源的保留计数为1。
但是,在Objective-C代码中使用调度源时,可以通过设置默认启用的编译器标志OS_OBJECT_USE_OBJC
,使Obj-C运行时假装GCB对象实际上是Obj-C对象。当使用ARC(自动参考计数)时,ARC还将为您管理GCD对象的生命周期。
假设两者都适用于您的代码,GCD对象被视为Obj-C对象并且ARC已启用,一旦方法-doingSomething:
完成,您的调度源就会被销毁,因为此方法只有对源的引用,此引用刚刚消失范围。