2016-09-07 2 views
1

iOS7에서 이상한 동작이 발견되었습니다. 나는 무거운 하중을 처리하는 dispatch_async 백그라운드 스레드가 있고이 스레드에서 UI를 업데이트하려고합니다. 아이폰 OS 8 일 및 제안하지만, iOS7에 테스트 장치에서 실행으로 위의 코드가 작동 위dispatch_async (dispatch_get_main_queue(),^{}); 배경에서 스레드가 느림 iOS7에서

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

    [self heavyFunction]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     [self updateUI]; 

    }); 
}); 

은 (아이폰 4S) dispatch_async(dispatch_get_main_queue(), ^{});에 대한 호출은 매번 사초 소요 : 그래서 다음처럼했다. 나는 이미 업데이트와 heavy_function을 가져 왔고 같은 동작이 계속 나타납니다. 그런 다음 나는 최소한의 예를 만들어 냈다. 그래서 나는 다른 것이 iOS7에서 내 main_queue를 막고 있을지도 모른다고 생각했지만 이것이 무엇인지 알아낼 수 없다. [self heavyfunction];가 끝날 때까지이 ViewController에서 발생하는 다른 UI 관련 작업은 없습니다.

모두 기본 SDK 9.3 및 배포 목표 7.0이 포함 된 XCode 7.3.1로 컴파일됩니다.

누구나 이미이 동작이 있었고 여기에서 차단할 수있는 방향으로 나를 가리킬 수 있습니까?

+1

시간 프로파일 러 도구를 사용해 보셨습니까? – Paulw11

+0

네,하지만 저는 단지 [UIView (Hierachy) layoutBelowIfNeeded]'를 약 2 초 동안 두 번 반복합니다. –

+0

충돌하는 제약 조건에 대한 경고가 표시됩니까? – Paulw11

답변

0

그래서 일부 연구를 통해 문제가 발견되었습니다. 내 백엔드에서 (NSNotificationCenter을 통해) 알림이있는 백그라운드 스레드를 호출하면이 알림은 두 개의 다른 ViewController에서 캐치되어 UITableViews의 데이터 소스를 업데이트합니다. 두 번째 것 (멈춤이있는 것)은 첫 번째 것 아래 NavigationController 계층 구조에 있습니다.

첫 번째 알림이 전혀 표시되지 않더라도 두 가지 알림 모두 동일한 시간에 처리되고 두 컨트롤러에서 UI가 다시로드됩니다. 하지만 이것은 iOS 7에서 일어나는 것처럼 보입니다. 위의 모든 iOS 버전은 보이지 않는 ViewController에서 UI를 다시로드하지 않습니다.

ViewController 사이에서 점프 할 때 데이터 소스가 백그라운드 스레드에서 업데이트되기 때문에 UI의 모든 것이 업데이트됩니다. 그래서 부스 ViewControllers 중 어느 것이 현재 표시되는지 만 확인하여 문제를 해결하고 그 UI.

여전히 버그가있는 것은 iOS 7 이상의 모든 iOS 버전이 자동으로이 문제를 처리하지만 iOS 7은 자동으로이 문제를 처리하지 않는다는 것입니다.