7

我正在开发一个应用程序,我想在单独的队列中使用dispatch_async. 我想在一定的时间间隔后重复调用该方法。但是该方法没有被调用。

我不知道怎么了。这是我的代码:

dispatch_async( NotificationQueue, ^{

        NSLog(@"inside queue");
        timer = [NSTimer scheduledTimerWithTimeInterval: 20.0
                                                 target: self
                                               selector: @selector(gettingNotification)
                                               userInfo: nil
                                                repeats: YES];

        dispatch_async( dispatch_get_main_queue(), ^{
            // Add code here to update the UI/send notifications based on the
            // results of the background processing

        });
    });

-(void)gettingNotification {
    NSLog(@"calling method ");
}
4

3 回答 3

12

如果要在 a 上调​​用重复计时器,请与 a 一起dispatch_queue_t使用:dispatch_source_createDISPATCH_SOURCE_TYPE_TIMER

dispatch_queue_t  queue = dispatch_queue_create("com.firm.app.timer", 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), 20ull * NSEC_PER_SEC, 1ull * NSEC_PER_SEC);

dispatch_source_set_event_handler(timer, ^{

    // stuff performed on background queue goes here

    NSLog(@"done on custom background queue");

    // if you need to also do any UI updates, synchronize model updates,
    // or the like, dispatch that back to the main queue:

    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"done on main queue");
    });
});

dispatch_resume(timer);

这将创建一个每 20 秒运行一次的计时器(第 3 个参数 到dispatch_source_set_timer),余量为 1 秒(第 4 个参数 到dispatch_source_set_timer)。

要取消此计时器,请使用dispatch_source_cancel

dispatch_source_cancel(timer);
于 2013-11-15T08:09:58.277 回答
2

试试这个代码

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    dispatch_async( dispatch_get_main_queue(), ^{

        timer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target: self
                                               selector: @selector(gettingNotification) userInfo: nil repeats: YES];
        // Add code here to update the UI/send notifications based on the
        // results of the background processing

    });
});

-(void)gettingNotification {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         //background task here
    dispatch_async( dispatch_get_main_queue(), ^{
        // update UI here
        );
});
}
于 2013-11-15T08:08:53.333 回答
0
int parameter1 = 12;
float parameter2 = 144.1;

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
    NSLog(@"parameter1: %d parameter2: %f", parameter1, parameter2);
});

寻找更多

您如何在延迟后触发块,例如 -performSelector:withObject:afterDelay:?

于 2013-11-15T07:57:32.763 回答