iOS 在系统空闲时定期执行低优先级任务

Posted

技术标签:

【中文标题】iOS 在系统空闲时定期执行低优先级任务【英文标题】:iOS Periodically perform a low-priority task while the system is idle 【发布时间】:2017-11-02 03:00:23 【问题描述】:

ios App 开发过程中。我想定期执行低优先级任务。并且不希望这个任务会影响主程序的工作。有什么方法可以实现?

现在我用timer做定时任务,但是经常发现App不流畅。

低优先级任务有时需要在主线程上运行,例如检查粘贴板而不是在 UI 上显示内容。

【问题讨论】:

【参考方案1】:

您必须为此使用块(完成处理程序),它是 GCD 的一部分。这将远离主线程。

创建一个名为“backgroundClass”的 NSObject 类。

在 .h 文件中

typedef void (^myBlock)(bool success, NSDictionary *dict);

@interface backgroundClass : NSObject

@property (nonatomic, strong)  myBlock completionHandler;

-(void)taskDo:(NSString *)userData block:(myBlock)compblock;

在 .m 文件中

-(void)taskDo:(NSString *)userData block:(myBlock)compblock
  // your task here
// it will be performed in background, wont hang your UI. 
// once the task is done call "compBlock" 

compblock(True,@@"":@"");

在你的 viewcontroller .m 类中

- (void)viewDidLoad 
    [super viewDidLoad];
backgroundClass *bgCall=[backgroundClass new];

 [bgCall taskDo:@"" block:^(bool success, NSDictionary *dict)
// this will be called after task done. it'll pass Dict and Success.    

dispatch_async(dispatch_get_main_queue(), ^
 // write code here if you need to access main thread and change the UI.
// this will freeze your app a bit.
);

];

【讨论】:

这会起作用,但是由于您正在分派到主线程,它仍然会导致主线程在执行时阻塞。您应该考虑使用主队列以外的调度队列。 取决于需要访问多少 UI,如果它非常频繁。是的,它仍然会滞后。 任务会重复,有时需要在主线程上运行。所以应该考虑执行频率、cpu消耗等。

以上是关于iOS 在系统空闲时定期执行低优先级任务的主要内容,如果未能解决你的问题,请参考以下文章

freeRTOS学习二

RTOS训练营上节回顾空闲任务定时器任务执行顺序调度策略和晚课提问

UCOSII 之 任务统计

STM32CubeIDE+FreeRTOS互斥量实验

有没有办法强制 Win32 计时器在不空闲时执行?

UCOSIII系统任务