2012-04-11 3 views
0

제목에서 언급했듯이 dispatch_async가 10 번 실행 중입니다. 그리고 GUI를보다 반응 적으로 만드는데 사용합니다. 그러나 그것이 10 번 발사 될 때,해야 할 모든 일을하는 데는 오랜 시간이 걸립니다.dispatch_async가 10 번 실행 중임

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    [self calculateAllThatShizzle]; 
}); 

을 그리고 calculateAllThatShizzle 방법은 (많은 루프 포함) 만 계산의 약 150 라인을 가지고 : 여기에 코드입니다.

나는 다음 시도했다 :

static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    [self calculateAllThatShizzle]; 
}); 

을하지만 그것은 단지 전체 라이프 사이클에 대해 한 번 사용하고 나는 그것을 페이지가 표시 될 때마다 발생해야하는 것처럼 그것은 보인다.

그래서 질문 : 어떻게 dispatch_async를 한 번만 실행하도록 할 수 있습니까?

어떤 도움을 주시면 감사하겠습니다은

이 dispatch_async 및 dispatch_once이 checkAndCalculateIfNecessary 방법에

편집 감사합니다.

- (void)scrollViewDidScroll:(UIScrollView *)sender { 
    // We don't want a "feedback loop" between the UIPageControl and the scroll delegate in 
    // which a scroll event generated from the user hitting the page control triggers updates from 
    // the delegate method. We use a boolean to disable the delegate logic when the page control is used. 
    if (pageControlUsed) { 
    // do nothing - the scroll was initiated from the page control, not the user dragging 
    return; 
    } 
    // Switch the indicator when more than 50% of the previous/next page is visible 
    CGFloat pageWidth = scrollView.frame.size.width; 
    int page = floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 
    pageControl.currentPage = page; 

    DetailViewController *controller = [viewControllers objectAtIndex:page]; 
    [controller saveTheValues]; 

    // load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling) 
    [self loadScrollViewWithPage:page - 1]; 
    [self loadScrollViewWithPage:page]; 
    [self loadScrollViewWithPage:page + 1]; 

    if ((page + 1) == kNumberOfPages) { 
    [controller checkAndCalculateIfNeccessary]; 
    } 
} 
+0

dispatch_async 메서드가 호출되는 위치는 어디입니까? – danielbeard

+0

@danielbeard PageControl이 해당 페이지로 스크롤 할 때 호출되는 메서드 – Novarg

+0

- (void) scrollViewDidScroll : (UIScrollView *) scrollView? – danielbeard

답변

2

나는 그 scrollViewDidScroll: 방법은 사용자가 스크롤 내용으로 여러 번 호출되고 있기 때문에, – scrollViewDidEndDecelerating:에 계산을 시도 및/또는 계산을해야하는 경우 제어 할 수있는 부울 값을 무슨 일이 일어나고 생각 : 그리고이 방법은 그와 같은 PageControl에서 호출 불.

+0

굉장한, 고마워하는 질문을 편집했다! 꼭 그래야만합니다! – Novarg

관련 문제