cari

Rumah  >  Soal Jawab  >  teks badan

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

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

迷茫迷茫2771 hari yang lalu535

membalas semua(4)saya akan balas

  • PHPz

    PHPz2017-04-18 09:53:38

    Adalah disyorkan untuk menggunakan pemasa GCD. Pemasa GCD berbeza daripada NSTimer dipengaruhi oleh RunLoop, tetapi pemasa GCD tidak terjejas kerana RunLoop juga berdasarkan 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);
    }

    balas
    0
  • ringa_lee

    ringa_lee2017-04-18 09:53:38

    Gunakan NSTimer singleton dan kemudian sertai urutan utama runloop

    balas
    0
  • 迷茫

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

    Agen plus GCDj plus singleton

    balas
    0
  • 黄舟

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

    Terpulang kepada anda cara menggunakannya, sila analisa situasi tertentu.

    • Amalan terbaik peribadi saya ialah Runloop, buat kelas baharu, buat urutan baharu selepas kelas memulakan tika, dengar mesej Runloop urutan ini, tambah sumber isyarat, dan kemudian laksanakan keperluan anda dalam kaedah panggil balik . Ini boleh mengelakkan beberapa NSTimer ralat atau masalah lain.

    • Yang kedua ialah pemantauan CADisplayLink Sudah tentu, pemantauan CADisplayLink juga mempunyai bahaya tersembunyi Ia mungkin menyebabkan "frame drop" kerana beban kerja yang berat.

    Sebenarnya, ia bukan mudah untuk dilaksanakan di latar belakang melainkan anda mendaftar 音频服务 Anda juga boleh mengkaji kaedah ini:

    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

    balas
    0
  • Batalbalas