我想在6秒后在一个单独的线程中后台运行一个任务。我使用这段代码来实现这个目的。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self getUnsyncNamesFromServer];
}我不确定这是在后台线程中运行的。为此,我需要使用dispatch_async吗?对于这种情况,最好的方法是什么?
发布于 2014-07-17 16:23:50
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
发布于 2014-07-17 16:40:28
您的代码将在主线程中运行,即不在后台运行,因为您使用的是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];
}
);发布于 2014-07-17 16:41:18
这一行将把你的任务放在主线程上,而不是单独的线程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;
}
});
}https://stackoverflow.com/questions/24798218
复制相似问题