search

Home  >  Q&A  >  body text

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

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

迷茫迷茫2936 days ago1059

reply all(4)I'll reply

  • PHPz

    PHPz2017-04-18 09:53:38

    It is recommended to use GCD’s timer. GCD's timer is different from NSTimer. NSTimer is affected by RunLoop, but GCD's timer is not affected because RunLoop is also based on 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);
    }

    reply
    0
  • ringa_lee

    ringa_lee2017-04-18 09:53:38

    Just use NSTimer单例,然后加入到主线程runloop

    reply
    0
  • 迷茫

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

    Agent plus GCDj plus singleton

    reply
    0
  • 黄舟

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

    It’s up to you how to use it, please analyze the specific situation.

    • Personal best practice is Runloop,新建一个类,类初始化实例之后新建一个线程,监听这个线程的Runloop消息,添加信号源,然后在回调的方法里实现你的需求. 这样可以避免一些NSTimererror or other issues.

    • The second one is monitoringCADisplayLink,当然,监听CADisplayLink, which also has hidden dangers. It may cause "frame drops" due to heavy workload.

    By the way, it’s not easy to implement in the background unless you register 音频服务. You can also study this method:

    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

    reply
    0
  • Cancelreply