Wie ich im Titel erwähnt habe, wird mein dispatch_async 10 mal ausgelöst. Und ich benutze es, um die GUI reaktionsfähiger zu machen. Aber wenn es 10 Mal feuert, dauert es sehr lange, um all die Dinge zu tun, die es zu tun hat. Hier ist der Code:dispatch_async wird 10 mal ausgelöst
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[self calculateAllThatShizzle];
});
Und die calculateAllThatShizzle Methode hat etwa 150 Zeilen nur Berechnungen (einschließlich viele Schleifen).
Ich habe versucht, die folgenden:
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self calculateAllThatShizzle];
});
Aber dann scheint es, wie es nur einmal für den gesamten Lebenszyklus verwendet wird und ich brauche es die Seite angezeigt wird jedes Mal zu feuern.
Die Frage ist also: Wie kann ich die dispatch_async zwingen, nur einmal zu feuern?
Jede Hilfe würde geschätzt, danke
EDIT
Diese dispatch_async und dispatch_once in checkAndCalculateIfNecessary Methode. Und diese Methode wird von der Pagecontrol so genannt:
- (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];
}
}
Wo wird die Methode dispatch_async aufgerufen? – danielbeard
@danielbeard in der Methode, die aufgerufen wird, wenn das PageControl zu dieser Seite scrollt – Novarg
- (void) scrollViewDidScroll: (UIScrollView *) scrollView? – danielbeard