2010-08-22 3 views
0

루프에서 일부 코드를 실행하고 싶지만 uiscrollview가 스크롤되는 동안 일시 중지하려고합니다.objective-c에서 루프를 일시 중지/다시 시작하는 방법

scrollViewDidScroll 메서드에서 "YES"로 설정되고 scrollViewDidEndDecelerating 메서드에서 "NO"로 설정된 isScrolling이라는 BOOL을 만들었습니다.

루프를 scrollViewDidEndDecelerating 메서드에 넣고 싶지만 isScrolling == YES 일 때 일시 중지하고 isScrolling == NO 일 때 다시 시작하고 싶습니다.

배열을 반복하고 있으므로 루프에서 배열을 중단 한 위치에서 루프를 가져오고 싶습니다.

예를 들어, 여기에 지속적으로 나는 viewDidAppear 방법에 배치 1 씩 높은 계산 간단한 루프입니다 :이 루프는 어떤 이유로 실행되는 동안

for (int i = 1; i > 0; i++) { 

    NSLog(@"i = %d", i); 

    if (isScrolling == YES) { 
     NSLog(@"break"); 
     break; 
    } 
}   

그러나, 모든 스크롤을 사용할 수 없습니다 그래서는 취소 할 수 없습니다.

어떻게하면됩니까?

감사합니다.

답변

2

당신은이 루프가 viewDidLoad 내에 있다고 말합니다. 이것은 메인 애플리케이션 스레드 (그리고 "UI 스레드")에 의해 실행된다는 것을 의미합니다. 그렇다면 아무 것도 할 수 없습니다. UI가 될 수 없습니다. 루프를 실행하는 스레드가 동일하기 때문에 루프가 실행되는 동안 아무 것도하지 마십시오.

실제로 루프에서 수행중인 작업에 대해 더 많이 알지 못하면 해당 작업을 오프로드하기 위해 수행 할 수있는 작업을 제안하기가 어렵습니다

+0

일부 하위보기에 이미지 그룹을 추가하여 나중에 빨리 볼 수 있습니다. 아쉽게도 uiviews 및 이미지는 스레드로부터 안전하지 않습니다.그랜드 센트럴 디스패치 (Grand Central Dispatch)를 사용하여 실험 해본 결과, 스레드 안전하지 않은 요소로 인해 불안정성이 발생한다는 것을 제외하면 일반적으로 작동합니다. – Jonah

+0

내가 시도한 적이 없기 때문에 이것은 잘못된 나무를 짖고 있을지도 모른다. 별도의 스레드에서 이러한 다양한 UIViews/UIImageViews를 구성 할 수 있는지 궁금하지만 performSelectorOnMainThread를 사용하여 활발하게 표시된 뷰 계층 구조에 추가하는 책임을지게됩니다. Windows에서 일반적으로 좋은 아이디어는 아니지만 UIView에 iOS의 멋진 세계에서 일종의 내부 스레드 선호도가 있는지 여부는 알 수 없습니다. – imaginaryboy

+0

이 돈이됩니다. 루프가 viewDidLoad에 있으면 모든 시각적 애니메이션과 사용자 상호 작용을 담당하는 기본 UI 스레드가 완전히 차단됩니다. – heckj

0

당신이 이것을 위해 유즈 케이스에서 무엇을 목표로 삼고 있는지 확실하지 않습니다 - 저는 UIScrollView를 느려지는 루프에서 어떤 일이 일어나고 있다고 생각합니다. 좋아해.

저는 비동기로 작업하는 백그라운드 작업을 일반적으로 너무 많은 CPU 리소스를 차지하지 않도록하는 것으로 추측하겠습니다. 스크롤보기가 움직이는 경우 실제로 반응하기 위해 바인딩하려면 UIScrollView Delegate 메소드가 기본 트리거 포인트가되도록하십시오. 잠재적 인 사용으로 눈에 띄는 것들은 :

– scrollViewWillBeginDragging: 
– scrollViewDidEndDragging:willDecelerate: 
– scrollViewDidEndScrollingAnimation: 

...

이있는 viewDidLoad에서 루프를 호출하지 마십시오 당신은 메인 UI 상호 작용 스레드를 차단하는 것입니다. 대신 고전적인 스레딩을 사용하거나 NSOperationQueue를 사용하여 백그라운드 프로세스를 트리거하면 수행하려는 모든 루핑/백그라운드 작업을 수행 할 수 있습니다. 뷰 컨트롤러에 대기열 참조가있는 경우 위의 위임 방법을 사용하여 스크롤을 결정하면 해당 작업을 일시 중지하거나 취소 할 수도 있습니다.

+0

내 tableView의 성능에 문제를 일으키는 메서드를 실행하려고한다는 것이 맞습니다. 불행히도 이미지와 uiviews는 스레드로부터 안전하지 않으므로 작업 할 수 있습니다. t a 그것들을 백그라운드 스레드에 동 기적으로로드하십시오. – Jonah

+0

아쉽게도 루프가 실행되는 동안 모든 스크롤과 터치가 비활성화되어있는 것처럼 보이는 메서드는 작동하지 않는 것 같습니다. 좀 더 명확히하기 위해 수정 된 질문을 참조하십시오. 도와 주셔서 감사합니다! – Jonah

관련 문제