У меня проблема с dispatch_source_t
, который я пытаюсь использовать. Я хочу использовать его для задержки обработки PHChange
на 5 секунд, потому что PHChange
может произойти несколько раз за короткий промежуток времени. Буду признателен за любую предложенную помощь. По сути, я хочу отменить предыдущий таймер dispatch_source_t
почти как NSTimer
.
@property (nonatomic, strong) dispatch_source_t libraryChangedTimer;
dispatch_source_t CreateTimerDispatchSource(uint64_t interval, uint64_t leeway, dispatch_queue_t queue, dispatch_block_t block)
{
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (timer)
{
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);
dispatch_source_set_event_handler(timer, block);
dispatch_resume(timer);
}
return timer;
}
- (void)libraryChanged:(PHChange *)changeInstance
{
NSLog(@"Called immediately and it shouldn't");
}
- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
if (self.libraryChangedTimer)
{
dispatch_source_cancel(self.libraryChangedTimer);
self.libraryChangedTimer = CreateTimerDispatchSource(5ull * NSEC_PER_SEC, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^
{
[self libraryChanged:changeInstance];
dispatch_source_cancel(self.libraryChangedTimer);
});
}
else
{
self.libraryChangedTimer = CreateTimerDispatchSource(5ull * NSEC_PER_SEC, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^
{
[self libraryChanged:changeInstance];
dispatch_source_cancel(self.libraryChangedTimer);
});
}
}
dispatch_source_t
не может бытьstrong
илиretain
в Xcode 7.1.1. Ваш код не будет компилироваться. - person Cœur   schedule 11.11.2015-DOS_OBJECT_USE_OBJC=0
, который, как описано в<os/object.h>
, отключает поведение объекта для типов GCD. Но я повторно протестировал это в Xcode 7.1.1 (а также в Xcode 7.2 beta 3), иstrong
работает нормально. - person Rob   schedule 11.11.2015dispatch_retain
иdispatch_release
. - person Rob   schedule 11.11.2015