2013-06-10 2 views
0

나는 내 인생에 대해 생각할 수없는 겉으로보기에는 간단한 문제가 있습니다. 내 IOS 응용 프로그램에서 나는 그것을 완료하는 데 몇 초가 걸릴 수 있습니다 도청시 네트워크 작업을 트리거 UICollectionView 있습니다. 정보가 다운로드되는 동안로드가 완료되고 세그가 트리거 될 때까지 사각형에있는 UIActivityIndicatorView으로 셀을 채우는 UIView을 표시하려고합니다. 문제는 결코 나타나지 않는다는 것입니다. 지금 내 코드는 다음과 같습니다.네트워크 작업 전에 UIView가 나타납니다.

myLoadView.hidden = NO; 
//Network Operation 
myLoadView.hidden = YES; 

앱이 몇 초 동안 멈추고 다음보기로 넘어갑니다. Grand Central Dispatch가 솔루션과 관련이 있다고 생각하지만,이 코드는 prepareForSegue에서 발생하므로 네트워크 정보를 다음보기로 전달해야합니다. 이러한 이유로 장면을 전환하기 전에 다운로드를 끝내지 않는 것이 명백한 문제입니다. 어떤 도움을 주시면 감사하겠습니다. 감사!

답변

2

아이폰 OS는 인터페이스의 변경 사항을 커밋과 같은 사용자 정의 HUD 라이브러리를 사용하는 것입니다. 그러므로 백그라운드 스레드에서 네트워크 작업을 수행 한 다음 메인 화면으로 돌아가서 "지금 내 모습보기"를 수행해야합니다. 아래 코드를 참조하십시오.

myLoadView.hidden = NO; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    //Network Operation 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     myLoadView.hidden = YES; 
    }); 
}); 
+0

이것은 기본적으로 이러한 문제를 해결하기위한 접근 방법입니다. 요청이 여전히 실행 중일 때 사용자가보기에서 전환 할 수 있다는 사실만으로 복잡해질 것입니다. 따라서 신뢰할 수있는 솔루션에는 NSURLConnection 대리자를 구현하는 비동기 네트워크 스타일로만 수행 할 수있는 취소 기능이 포함되어야합니다. – CouchDeveloper

-1

음 표시의이 유형에 대한 더 나은 옵션은 루틴을 밖으로 근무 후 SVProgressHUD 또는 MBProgressHUD

+0

왜 그런 간단한 문제에 대해 전체 라이브러리를 권장합니까? – SK9

+0

그 라이브러리는 요구 사항에 적합하다고 생각됩니다. 그래서 그러한 라이브러리를 지적하는 것은 결코 잘못된 것이 아닙니다. –

0

네트워크 작업은 기본 스레드 인 일명 UI 스레드에서 수행되는 것으로 보입니다. 이렇게하면 완료 될 때까지보기를 숨기기 취소 할 때까지의 모든 추가 UI 호출이 차단됩니다.

이 문제를 해결하려면 비동기 호출을하십시오.

this을 아직 읽지 않았 으면 읽어야합니다.

0

다른 답변에 언급했듯이 UIView 변경은 현재 메서드가 실행을 마칠 때까지 (즉, 사용자가 차단할 때까지) 발생하지 않습니다. GCD를 사용할 수 있기 전에 메소드를 두 개로 분할하고 performSelector:withObject:afterDelay (UI 루프에서도 두 번째 부분 실행) 또는 performSelectorInBackground:withObject:을 첫 번째 메소드 끝에 사용합니다. 그러면 기다림 애니메이션을 모두 커밋 한 다음 두 번째 방법에서 실제 작업을 수행합니다.

관련 문제