recherche

Maison  >  Questions et réponses  >  le corps du texte

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

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

迷茫迷茫2771 Il y a quelques jours539

répondre à tous(4)je répondrai

  • PHPz

    PHPz2017-04-18 09:53:38

    Il est recommandé d’utiliser la minuterie de GCD. Le minuteur de GCD est différent de NSTimer. NSTimer est affecté par RunLoop, mais le minuteur de GCD n'est pas affecté car RunLoop est également basé sur 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);
    }

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 09:53:38

    Utilisez NSTimer singleton puis rejoignez le fil de discussion principal runloop

    répondre
    0
  • 迷茫

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

    Agent plus GCDj plus singleton

    répondre
    0
  • 黄舟

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

    C'est à vous de décider comment l'utiliser, veuillez analyser la situation spécifique.

    • Ma meilleure pratique personnelle est Runloop, créer une nouvelle classe, créer un nouveau fil après que la classe ait initialisé l'instance, écouter le message Runloop de ce fil, ajouter la source de signal, puis implémenter vos besoins dans la méthode de rappel . Cela peut éviter certaines NSTimer erreurs ou autres problèmes.

    • Le deuxième est la surveillance CADisplayLink Bien sûr, la surveillance CADisplayLink comporte également des dangers cachés. Elle peut provoquer des « chutes de trame » en raison d'une lourde charge de travail.

    • .

    D'ailleurs, ce n'est pas facile à mettre en œuvre en arrière-plan à moins de s'inscrire 音频服务 Vous pouvez également étudier cette méthode :

    .
    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

    répondre
    0
  • Annulerrépondre