2013-09-04 4 views
0

Google에서 진행하는 앱은 처음 시작될 때 다양한 뉴스 피드를 가져 와서 만료 된 소식을 업데이트합니다. 이런 일이 발생하는 동안 인터페이스가 자주 멈추고 아무 것도 클릭 할 수 없습니다. 실제 네트워크 호출은 별도의 스레드에서 수행되지만 데이터베이스 작업은 주 스레드에서 수행됩니다. 이로 인해 인터페이스가 정지됩니까?iOS - 네트워크 통화 도중 시작시 앱 인터페이스가 멈 춥니 다.

한 번에 두 개의 피드 만 네트워크 작업 대기열에 삽입하여 한 번에 모든 피드를 시도하지 않도록 설정해야한다고 들었지만 이미 설정되어 있습니다. 한 번에 너무 많은 네트워크 호출 만 수행하십시오. 나는 어떻게해서든지 연속적으로 거기에 넣어 지려한다면, 한 번에 대기열에있는 물건을 줄이는 것이 더 빨리 진행될 수 있다는 것을 이해하지 못합니다. 내가 틀렸다면 나에게 정정 해주세요.

UI를 시작하는 동안 UI가 멈추는 원인이 무엇인지에 대한 모든 종류의 도움을 받아 주시면 감사하겠습니다.

답변

1

시간이 많이 소요되는 작업을 주 스레드에서 멀리 이동하는 것이 좋습니다.

다행히도 iOS에서 매우 간단합니다. 시간이 많이 걸리는 작업이 매우 간단 경우는 사용을 고려할 수 performSelectorInBackground

예컨대 :

[self performSelectorInBackground:@selector(myFunction:) 
    withObject:myParam]; 

그것은 당신이 배경 스레드에서 GUI에 액세스 안된다는 것을, remberber하기 그러나 중요하다. 다시 메인 스레드 객체를 얻을 performSelectorOnMainThread

는 예컨대 사용하려면

[self performSelectorOnMainThread:@selector(myFunction:) myParamwaitUntilDone:YES]; 

이 당신의 데이터베이스 호출에이 전략을 적용 해보십시오. 시나리오에 따라 NSOperation에 마무리하거나 동결의 원인이 발견되면 스레드를 사용할 수 있습니다.

+1

코코아 터치에 NSTask가 있다고 생각하지 않습니다. NSOperationQueue 또는 gcd를 사용하는 것이 좋을 것입니다. – Sandeep

+0

@ insane-36 당신은 NSTask에 대해 절대적으로 맞습니다. 답변을 업데이트했습니다. PerformSelectorInBackground는 스레드 설정과 관련된 모든 번거 로움없이 백그라운드에서 실행되는 데 도움이되는 코드가 있는지 테스트 할 수있는 매우 편리한 방법입니다. – EsbenB