제목에서 언급했듯이 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];
}
}
dispatch_async 메서드가 호출되는 위치는 어디입니까? – danielbeard
@danielbeard PageControl이 해당 페이지로 스크롤 할 때 호출되는 메서드 – Novarg
- (void) scrollViewDidScroll : (UIScrollView *) scrollView? – danielbeard