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

时间:2014-07-17 08:13:43

标签: ios multithreading concurrency background-process

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

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

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

3 个答案:

答案 0 :(得分:7)

dispatch_async就是你想要的。在您使用的代码中,块内的方法将在主队列上经过6秒。

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

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

    [weakSelf getUnsyncNamesFromServer];

});

如需进一步参考,请参阅GCD Apple Doc:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/c/func/dispatch_async

答案 1 :(得分:1)

您的代码将在主线程中运行,即不在后台运行,因为您使用的是dispatch_get_main_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];
               }
);


请务必阅读https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

答案 2 :(得分:1)

这一行将把你的任务放在主线程上而不是单独的线程上 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC), dispatch_get_main_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:

来注册iOS
// 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;
            }
    });

}