gpt4 book ai didi

ios - 在 iOS 中的不同线程上执行后台任务

转载 作者:可可西里 更新时间:2023-11-01 06:19:13 26 4
gpt4 key购买 nike

如何在不同线程的后台执行某些操作,如果它在主线程上执行,它会阻塞我的应用程序的 UI。有人知道怎么做吗?

即使它在后台打印 NSLog 也没有问题。即使用户按下主页按钮,我也想运行以下内容。在我的 viewController 中,我这样做了:

- (IBAction)btnStartClicked:(UIButton *)sender {
[NSThread detachNewThreadSelector:@selector(StartBGTask) toTarget:self withObject:nil];
}

-(void)StartBGTask{
[[[UIApplication sharedApplication] delegate] performSelector:@selector(startThread)];
}

在 appDelegate.m 中我有这个方法

 -(void) startThread {
@autoreleasepool {
for (int i = 0; i < 100; i++) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"current progress %d", i);
});
[NSThread sleepForTimeInterval:1];
}
}
}

它以 1 秒的间隔打印从 1 到 100 的整数。

最佳答案

将这些属性添加到您的 .h 文件

@property (nonatomic, strong) NSTimer *updateTimer;
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;

现在用这个替换 btnStartClicked 方法,

-(IBAction)btnStartClicked:(UIButton *)sender {
    self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.5
                                                        target:self
                                                      selector:@selector(calculateNextNumber)
                                                      userInfo:nil
                                                       repeats:YES];
    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"Background handler called. Not running background tasks anymore.");
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }];
    
}

-(void)calculateNextNumber{
@autoreleasepool {
// this will be executed no matter app is in foreground or background
}
}

如果你需要停止它使用这个方法,

 - (IBAction)btnStopClicked:(UIButton *)sender {

[self.updateTimer invalidate];
self.updateTimer = nil;
if (self.backgroundTask != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}
i = 0;
}

关于ios - 在 iOS 中的不同线程上执行后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17966983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com