搜索

首页  >  问答  >  正文

ios - 用什么类 可以每隔一段时间执行一次代码 包括在后台

1.用timer的话 vc没有了 timer也跟着释放了 如果不释放 那就成循环引用了
2.用本地通知的话,只能设置固定时间为触发时间,不能像定时器那样每隔一段时间执行一次

迷茫迷茫2771 天前536

全部回复(4)我来回复

  • PHPz

    PHPz2017-04-18 09:53:38

    建议使用 GCD 的定时器。GCD 的定时器和 NSTimer 是不一样的,NSTimer 受 RunLoop 影响,但是 GCD 的定时器不受影响,因为 RunLoop 也是基于 GCD 的。

    -(void) startGCDTimer{
        
        // GCD定时器
        static dispatch_source_t _timer;
        NSTimeInterval period = 1.0; //设置时间间隔
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒执行
        // 事件回调
        dispatch_source_set_event_handler(_timer, ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"Count");
            });
        });
            
        // 开启定时器
        dispatch_resume(_timer);
            
        // 关闭定时器
        // dispatch_source_cancel(_timer);
    }

    回复
    0
  • ringa_lee

    ringa_lee2017-04-18 09:53:38

    使用NSTimer单例,然后加入到主线程runloop中即可

    回复
    0
  • 迷茫

    迷茫2017-04-18 09:53:38

    代理加GCDj加单例

    回复
    0
  • 黄舟

    黄舟2017-04-18 09:53:38

    怎么用看你啦,具体情况具体分析.

    • 个人最佳实践是Runloop,新建一个类,类初始化实例之后新建一个线程,监听这个线程的Runloop消息,添加信号源,然后在回调的方法里实现你的需求. 这样可以避免一些NSTimer误差或者其他的问题.Runloop,新建一个类,类初始化实例之后新建一个线程,监听这个线程的Runloop消息,添加信号源,然后在回调的方法里实现你的需求. 这样可以避免一些NSTimer误差或者其他的问题.

    • 第二个是监听CADisplayLink,当然,监听CADisplayLink也是有隐患的,可能会由于任务量繁重造成"掉帧".

    对了,在后台是不好实现的,除非注册音频服务

  • 🎜第二个是监听CADisplayLink,当然,监听CADisplayLink也是有隐患的,可能会由于任务量繁重造成"掉帧".🎜 🎜对了,在后台是不好实现的,除非注册音频服务. 还有你可以研究研究这个方法:🎜
    NS_CLASS_AVAILABLE_IOS(2_0) @interface UIApplication : UIResponder
    
    /*! The system guarantees that it will not wake up your application for a background fetch more
        frequently than the interval provided. Set to UIApplicationBackgroundFetchIntervalMinimum to be
        woken as frequently as the system desires, or to UIApplicationBackgroundFetchIntervalNever (the
        default) to never be woken for a background fetch.
     
        This setter will have no effect unless your application has the "fetch" 
        UIBackgroundMode. See the UIApplicationDelegate method
        `application:performFetchWithCompletionHandler:` for more. */
    - (void)setMinimumBackgroundFetchInterval:(NSTimeInterval)minimumBackgroundFetchInterval NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
    
    @end

    回复
    0
  • 取消回复