0
에서 큐를 출시 : 배경이 만료내가 인쇄 백그라운드 작업을 수행하는 대기열 생성 ARC
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_queue = dispatch_queue_create("q.myqueue.com", nil);
dispatch_set_finalizer_f(self.queue, &myFinalizerFunction);
background = UIBackgroundTaskInvalid;
t = nil;
[self beginBackgroundTask];
}
- (void)beginBackgroundTask {
// Start the long-running task and return immediately.
dispatch_async(self.queue, ^{
UIApplication *app = [UIApplication sharedApplication];
background = [app beginBackgroundTaskWithExpirationHandler:^{
[self endBackgroundTask];
}];
NSLog(@"background created: %d", background);
t = [NSTimer scheduledTimerWithTimeInterval:5.0
target:self
selector:@selector(printIt)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:t
forMode:NSRunLoopCommonModes]; // NSDefaultRunLoopMode
[[NSRunLoop currentRunLoop] run];
});
}
- (void)endBackgroundTask {
NSLog(@"Ending background");
if (t!=nil) {
[t invalidate];
t = nil;
}
[[UIApplication sharedApplication] endBackgroundTask:background];
background = UIBackgroundTaskInvalid;
NSLog(@"Ended!");
}
후, [self endBackgroundTask]
가 호출을; 그러나 "Pause Program Execution"으로 Xcode 디버그를 모니터 할 때, "Q.myqueue.com"큐가 여전히 보입니다! 배경 작업이 만료 된 후 큐가 "q.myqueue.com"엑스 코드 디버그에 여전히 존재 이유
Thread 2
Queue: q.myqueue.com
0 mach_msg_trap
7 -[NSRunLoop(NSRunLoop) run]
8 __37-[ViewController beginBackgroundTask]_block_invoke
9 _dispatch_call_block_and_release
14 _pthread_wqthread
는 아무도 설명 할 수 있습니까?
dispatch_release(self.queue)
을 사용하고 싶지만 ARC는 거부합니다.
감사합니다.
감사합니다. gnasher729. 동의 해, 나는 실행 루프로 놀고 싶지 않다! 하지만 백그라운드에서 일하는 타이머가 필요하므로 다른 선택의 여지가없는 것 같습니다. [[NSRunLoop currentRunLoop] addTimer : t forMode : NSRunLoopCommonModes]; 또는 [[NSRunLoop currentRunLoop] run]; 또는 둘 다에 대해 언급하면 타이머가 작동하지 않습니다! 더 좋은 방법있으세요? 나는 알고 싶다. – quanguyen