2012-04-11 6 views
0

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]; 
    } 
} 
+0

Wo wird die Methode dispatch_async aufgerufen? – danielbeard

+0

@danielbeard in der Methode, die aufgerufen wird, wenn das PageControl zu dieser Seite scrollt – Novarg

+0

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

Antwort

2

Ich denke, das passiert, weil scrollViewDidScroll: Methode mehrfach als Benutzer den Inhalt aufgerufen wird, versuchen Berechnungen in – scrollViewDidEndDecelerating: und/oder einen Bool Wert machen zu kontrollieren, wenn Berechnungen sollten Feuer.

+0

genial, danke! Funktioniert genauso wie es sollte! – Novarg

Verwandte Themen