2017-01-11 6 views
6

내 앱은 UIBackgroundMode을 사용합니다. 즉, 앱이 활성화되어 있지 않아도 블루투스 이벤트가 발생하면 iOS가 앱을 다시 실행합니다. 따라서 블루투스 이벤트는 iOS에 의해 백그라운드 대기열로 발송됩니다 (대기열은 나로 지정됩니다).앱이 백그라운드로 다시 시작되면 기본 대기열이 전달됩니까?

수 내가 다시 메인 큐 그러나 파견 코드, 즉

DispatchQueue.main.async { } (스위프트)

dispatch_async(dispatch_get_main_queue(), ^{ }) (목표 - C)

하고 실행 루프가 실행 중이라고 가정, 즉 내 블록이 파견 되나요? 아니면 배경 모드에서 일시 중단 메인 큐이며 따라서 나는 그것에 블록을 추가하는 것을 피해야합니까?

+0

동일한 작업을 시도해 보셨습니까? –

+0

앱이 백그라운드 모드에서 실행되는 동안 블록이 실행되기 때문에 iOS가 메인 루프를 실행하는 것으로 보이는 실험을 만들었습니다. 그러나 iOS가 항상 이와 같이 동작 할 것이라고 가정 할 수는 없습니다. 메인 루프를 계속 실행한다면 내 애플 리케이션에서 훨씬 더 쉬울 것이다. 왜냐하면 필요할 때 메인 큐로 간단하게 디스패치하기 때문에 스레드 동기화가 필요 없기 때문이다. –

답변

3

백그라운드에서 메인 대기열로 파견하는 것이 안전해야합니다.

앱이 백그라운드에있을 때 시스템이 앱을 낮은 우선 순위로 표시하기 때문에 앱이 백그라운드 스레드에서 기술적으로 수행됩니다. 그러나 시스템에서 코드를 실행할 수 있으려면 최소한 기본 대기열이 있어야합니다. 따라서 메인 큐에 액세스 할 수 있다고 가정하는 것이 안전합니다. 원하는 경우 다른 작업 대기열을 만들 수는 있지만 실행을 위해 모든 것이 하나의 백그라운드 스레드에 밀려날 가능성이 큽니다. 그리하여 많은 이점을 볼 수 없습니다.

백그라운드 스레딩 테스트는 약간 까다 롭습니다. 배경 스레드는 항상 실행되고 시뮬레이터에있는 동안 절대로 종료되지 않는 것처럼 보입니다. Xcode가 연결되어 있고 디버깅 중이면 장치에서 테스트 할 때도 마찬가지입니다. 또한이 시스템을 사용하면 필요한 경우 배경을 입력 한 후 앱을 10 분 동안 계속 실행할 수 있습니다 (마지막으로 확인했는데, 지난 1 ~ 2 시간 동안 변경되었을 수 있음). 추가로 얻으려는 블루투스 이벤트와 같은 것이 필요할 것입니다. 백그라운드에서 시간.

출처 : 불행한 경험을 배경으로 응용 프로그램을 다루고 있습니다.

+0

10 분 정도면 되니? 설명서에 따르면 일시 중지되기 전에 백그라운드 모드로 전환 할 때 앱이 10 초 _가됩니다. –

+1

아, 맞아요, 백그라운드 서비스 (위치 업데이트 같은)가 없다면 10 초, 그 시점에서 시스템은 그 위치 업데이트가 최대 10 분 동안 계속 될 것이라고 생각합니다. 물론 중요한 다른 위치 변경이나 블루투스 업데이트와 같이 앱에서 배경 시간을 늘리지 않는 한. 결론은 백그라운드에서 실행되는 앱을 빌드 할 때 언제든지 종료 할 준비가 필요하다는 것입니다. – esthepiking