如何在后台线程iOS中运行进程

如何在后台线程iOS中运行进程,ios,multithreading,concurrency,background-process,Ios,Multithreading,Concurrency,Background Process,我想在6秒后在一个单独的线程中在后台运行一个任务。我用了这个密码 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [self getUnsyncNamesFromServer]; } 我不确定这是否在后台线程中运行。我是否需要为此使用dispatch\u async。对于这种情况,什么是最好的方法。dispatch\u asy

我想在6秒后在一个单独的线程中在后台运行一个任务。我用了这个密码

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
            [self getUnsyncNamesFromServer];
}

我不确定这是否在后台线程中运行。我是否需要为此使用dispatch\u async。对于这种情况,什么是最好的方法。

dispatch\u async
是您想要的。在您使用的代码中,块内的方法将在主队列上运行6秒后

对于后台队列,请使用以下命令:

__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{

    [weakSelf getUnsyncNamesFromServer];

});

为了进一步参考,这里是GCD Apple文档:

您的代码将在主线程中运行,即不在后台运行,因为您使用的是
dispatch\u get\u main\u queue


我将创建一个新队列,而不是使用主队列。代码类似于:

dispatch_queue_t unsyncNamesQueue =
    dispatch_queue_create("UnsyncNamesFromServer", DISPATCH_QUEUE_SERIAL);
//....
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC),
               unsyncNamesQueue, ^{
                   [weakSelf getUnsyncNamesFromServer];
               }
);


请务必阅读

这一行将把您的任务放在主线程上,而不是放在单独的线程上
dispatch\u after(dispatch\u time(现在的dispatch\u time,每秒6*NSEC),dispatch\u get\u main\u queue(),^{

要放入辅助线程,您必须放入全局并发队列或创建自己的专用队列

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC),dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Put on global queue to run seprate thread
            [self getUnsyncNamesFromServer];
}
现在要在后台运行(当应用程序处于后台状态时),您不需要在单独的线程上运行,但如果您的应用程序在主线程上执行任务花费的时间太长,则应该在单独的线程上运行,因为不建议在主线程上阻塞太多时间

您的代码将不会在应用程序的后台状态下运行,因为您需要通过调用
beginBackgroundTaskWithExpirationHandler:

// Declare property in your class
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;


-(void)yourfunction{

   self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;

    }];

__weak typeof(self) weakSelf = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC),dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Put on global queue to run seprate thread
            [weakSelf getUnsyncNamesFromServer];

            if (weakSelf.backgroundTask != UIBackgroundTaskInvalid) {
               [[UIApplication sharedApplication] endBackgroundTask:weakSelf.backgroundTask];
                 weakSelf.backgroundTask = UIBackgroundTaskInvalid;
            }
    });

}

谢谢@dezinezync。我可以在dispatch\u after块中使用dispatch\u async吗。dispatch\u after是异步的,如Apple文档中所述。只需运行文本搜索即可。如果您确实需要在dispatch\u after块中调用dispatch\u async,那也应该可以。既然
dispatch\u after
已经是异步的,我不明白为什么要调用它
dispatch\u async
必须在
dispatch\u之后进行
调度。他可能希望在不同的线程上推送另一个块。这就是为什么!这将在6秒后在主线程/dispatch\u get\u main\u队列上运行该块。