2012-02-27 5 views
0

도움이 필요합니다.ios에서 멀티 스레딩

내 응용 프로그램에서 지속적으로 실행을 계속하고 업데이트 된 데이터를 다운로드하여 문서 폴더에 저장하는 백그라운드 프로세스를 구현하고 싶습니다.

내 스레드는 문서 폴더를 계속 확인하고 업데이트 된 데이터를보기 컨트롤에 표시해야합니다.

보기가 사라지면 하위 스레드가 종료되어야합니다. 보기가 나타나면 다시 시작하십시오.

가장 좋은 방법은 무엇입니까? NSThread 또는 NSOperationQueue? 어떤 예방 조치가 필요합니까? 클래스의 몇 가지 변수에 액세스해야합니다. 스레드로부터 안전해야합니다.

미리 감사드립니다.

감사

+0

많은 것을 시도했습니다. 내 목표를 달성하지 못했습니다. 누구든지 제게 뭔가 제안 해 줄 수 있어요. 백그라운드에서 계속 실행되는 하나의 스레드를 만들고 싶습니다. 그것은 10-20 이미지를 반복적으로 다운로드 할 while (1) 루프를가집니다. 다운로드는 스레드에서 동기식/비동기식으로 수행됩니다. 비동기 호출에서 내가 직면 한 문제는 성공/실패 콜백 함수가 호출되지 않는다는 것입니다. 동기화 통화에서 내가 직면 한 문제는 URL 요청에 사용자 이름과 비밀번호를 보낼 수 없다는 것입니다. – Nir

답변

2


당신이 iOS5를에서 진행률 표시 줄이나 뭐 당신이 비동기 실행 NSOperationQueue 내부 블록으로 다운로드 할 수 있습니다 하나의 거대한 API 방법 + sendAsynchronousRequest:queue:completionHandler:이 업데이트 할 필요가없는 경우. 그렇지 않다면 ASIHTTP 요청이나 https://github.com/AFNetworking/AFNetworking과 같은 제 3 자 라이브러리를 조사하거나 (아마도 마지막 하나가 더 낫다) 간단한 작업이 아닌 자신 만의 다운로드 관리자를 만들어야합니다.

+0

제안 해 주셔서 감사합니다. 나는 단지 데이터를 다운로드하고 싶지 않다. 또한 스레드에서 다른 작업을 수행해야합니다. 둘째, 계속 백그라운드에서 실행되어야합니다. sendAsynchronousRequest : queue : completionHandler :가 가장 좋은 방법이라고 생각하십니까? – Nir

+0

글쎄, 당신이 다운로드하는 동안 들어오는 데이터로 뭔가를 할 필요가 있다면 .. 그것은 단지 당신에게 경쟁 처리기에서 뭔가를 할 수있는 기회를주기 때문에 그렇지 않습니다. 예를 들어 보겠습니다. 다운로드해야하는 파일이 정말 큽니다. 이 경우 마지막에 데이터를 추가하는 스트림이나 파일 핸들러를 선택합니다.나는 당신이 AFNetoworking을보아야한다고 생각합니다. NSURLconnection 메서드를 둘러싼 단순한 래퍼 일뿐입니다. – Andrea

+0

감사합니다. AFNetoworking을 통해 갈 것입니다. – Nir

0

두 가지 방법이 있습니다.

첫 번째 : GCD에서 빌드되었지만 몇 가지 추가 기능이 있기 때문에 조금 부피가 큰 NSOperationQueue를 사용합니다.

둘째 : GCD (그랜드 센트럴 디스패치)를 사용하면 요구 사항을 살펴볼 수 있습니다. 어떤 스레드 (주 또는 배경)에 쉽게 접근 할 수 있기 때문에 GCD가 괜찮은 것처럼 보입니다.

+0

이 기능은 비동기 호출에 사용할 수 있습니까? – Nir

+0

비동기의 배경은 배경 스레드에서 뭔가를 수행하여 일반적으로 UI를위한 기본 대기열에 영향을 미치지 않도록하는 것입니다. 이것이 비동기 동작을 제공하기위한 목적입니다. –

+0

정확하게, NSURLConnection 콜백이 모두 주 스레드에서 작동한다는 오해가 있습니까? 현재 스레드를 묻는 로그를 넣을 수 있습니다. 보조 스레드에서 실행 루프를 작성하지 않으면이 스레드는 절대로 대리자 메소드를 수신하지 않습니다. 비동기 연결은 메인을 막지 않습니다. 왜냐하면 비동기이기 때문에 바로 실행 루프의 각 사이클마다 데이터를 청크에 첨부합니다. 또한 위임 콜백에서 볼 수 있듯이 완료하는 데 너무 많은 시간이 필요하지 않습니다. NSOperationQueue ioS4 이후에 모든 작업을 실행한다는 것은 새로운 스레드에서 모든 작업을 실행한다는 의미입니다. 즉, 루프를 만들지 않으면 모든 것이 누락됩니다. – Andrea

0

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg이 방법을 사용하면 응용 프로그램에 새 스레드가 만들어지고 응용 프로그램이 다중 스레드 모드가 아닌 경우 다중 스레드 모드로 전환됩니다. viewDidDisappear에서보기가 사라지면 작업을 중지 할 수 있습니다.

Apple 문서. Apple은 동시성을 구현하기위한 Mac OS X의 다른 기술을 조사 할 것을 권장합니다. 특히 스레드 응용 프로그램을 구현하는 데 필요한 디자인 기술에 익숙하지 않은 경우에 특히 그렇습니다. 이러한 대체 기술은 동시 실행 경로를 구현하고 기존 스레드보다 훨씬 우수한 성능을 제공하기 위해해야하는 작업을 단순화합니다. https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2

+0

명확성을 위해 동기화 연결을 사용하면 작동합니다. 비동기 연결의 경우에는 실행 루프가 실행되지 않습니다. 연결이 완료되었습니다. 새로운 쓰레드를 가지고 있다고해서 실행 루프가 충분히 살아 있음을 의미하지는 않습니다. – Andrea

+0

@ 안드레아 나는이 문제에 직면 해있다. 내 스레드에서 비동기 호출을 사용하고 있습니다. 이것은 문제를 일으키고 있습니다. 그렇다면 스레드에서 비동기 호출을 사용하는 가장 좋은 방법은 무엇입니까? 나는 NSThread와 GCD를 사용해 보았다. 두 경우 모두 같은 문제에 직면하고 있습니다. – Nir

+0

@ 안드레아 이제 NSOperation을 시도 할 것입니다. – Nir