Maison > Questions et réponses > le corps du texte
1.用timer的话 vc没有了 timer也跟着释放了 如果不释放 那就成循环引用了
2.用本地通知的话,只能设置固定时间为触发时间,不能像定时器那样每隔一段时间执行一次
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);
}
ringa_lee2017-04-18 09:53:38
Utilisez NSTimer
singleton puis rejoignez le fil de discussion principal runloop
黄舟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