2014-06-06 1 views
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는 거부합니다.

감사합니다.

답변

0

대기열에 대한 참조가 있습니다. 큐는 _queue가 nil로 설정되지 않는 한 거기에 남아 있습니다. _queue = nil로 설정하면됩니다. 대기열은 작업이 실행되고있는 한 살아있을 것입니다.

그런데 런 루프로 놀고있는 개발자는 정말로 영리하거나 바보 같은 사람뿐입니다. 나는 가능한 한 그들에게서 멀리 떨어져있다.

+0

감사합니다. gnasher729. 동의 해, 나는 실행 루프로 놀고 싶지 않다! 하지만 백그라운드에서 일하는 타이머가 필요하므로 다른 선택의 여지가없는 것 같습니다. [[NSRunLoop currentRunLoop] addTimer : t forMode : NSRunLoopCommonModes]; 또는 [[NSRunLoop currentRunLoop] run]; 또는 둘 다에 대해 언급하면 ​​타이머가 작동하지 않습니다! 더 좋은 방법있으세요? 나는 알고 싶다. – quanguyen