2013-10-01 7 views
6

Mit iOS7 bekommen wir einen zeitweiligen Bug. Es ist nicht mit iOS6 passiert.dispatch_after und [UIView Animation: Dauer] passieren sofort (sollten aber nicht)

Es beginnt nicht sofort, aber ~ 30sec bis ~ 2 min in das Spiel, alle Animationen und die dispatch_after Befehle geschehen sofort.

Um genauer zu sein, die Animationen als ob das geschehen „Dauer:“ Wert 0 ist, obwohl es auf jeden Fall nicht 0 Um genauer zu sein, wird der dispatch_after geschieht, als ob die Wartezeit = 0

Sobald es gestartet wird, bleibt es bestehen, bis die Software beendet wird.

Ich habe keine Ahnung, wie dies zu debuggen, oder wenn es ein Fehler iOS7 ist. Any thoughs/help würde sehr geschätzt werden!

+1

Sie sollten einen Code zeigen –

+0

Ich habe das gleiche Problem. Es scheint nur nach ca. 5 Minuten Gameplay zu passieren, und bisher kann ich es nur auf einem iPad2 mit iOS7 reproduzieren. Es scheint in der Regel zu passieren, wenn der RAM für die App 80 MB (von 256, die das iPad2 hat) erreicht. Dies erschien mir zunächst als eine Menge an Speicher verwendet werden. Es scheint so, als ob alle Bilder, die ich verwendet habe, im Speicher zwischengespeichert werden (auch wenn sie nicht mehr auf dem Bildschirm sind und keine Referenzen an ihnen gehalten werden - zB kein Speicherleck). Ich werde versuchen, den Speicherbedarf der App zu reduzieren und zu sehen, ob das hilft. –

+0

Ich habe ein Raster von Ansichten und eine Geste löst eine Animation aus, die die Hintergrundfarbe jeder Ansicht ändert, wobei die Animationen um eine Konstante voneinander getrennt sind. Nach ca. 30 Iterationen beginnen die Animationen zur gleichen Zeit. Zuerst werden zwei Animationen gleichzeitig ausgelöst, dann einige Animationen später, 3 werden sofort ausgelöst und so weiter. ABER! Wenn die Geste eine weitere Runde auslöst, beginnt eine neue Reihe von Animationen, und die vorherigen Animationen, die noch nicht ausgelöst wurden, beginnen sich erneut zu verhalten. – user

Antwort

1

Ist das Problem, dass Sie glauben, dass Ihr Abschlussblock vorzeitig aufgerufen wird?

Wenn ja, haben Sie den Wert des booleschen Werts überprüft, der an den Abschlussblock übergeben wurde? Sie möchten möglicherweise nur die Anweisungen in diesem Block ausführen, wenn der boolesche Wert wahr ist.

z.B.

[UIView animateWithDuration... animations:^{ 
    //do something 
} completion:^(BOOL finished) { 
    if (finished) { 
     // do something 
    } 
}]; 

Ich sah dies, wenn der Abschluss-Block vor der Animation begonnen hatte, auch genannt wurde, aber es war eigentlich wegen etwas anderem die Animation abgebrochen hatte, daher finished = NO.

Dies beantwortet nicht die Frage dispatch_after, so dass Sie immer noch einen Fehler dort auftreten können.

+1

Ich habe das gleiche Problem wie in der obigen Frage beschrieben, und selbst wenn animateWithDuration sofort ausgeführt wird, ist noch immer YES –

0

Die Frage Titel und die Beschreibungen scheinen unterscheiden (Unklare zu verstehen) zu sein, jedenfalls, wenn Sie die Aufgabe produzieren wollen nach einiger Zeit dann unten schauen

dispatch_after und [UIView Animation: duration] happen sofort

Das könnte funktionieren:

// Do your stuff OR animations then use below for DISPATCH_AFTER... 
double delayInSeconds = 2.0f; 
      dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
      dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
       // Do your Stuff Or Add Animation 
       [UIView animateWithDuration:.6f animations:^{ 
        self.tableView.contentOffset = CGPointMake(0, 173); 

       }]; 
      }); 
+0

Ich denke, der Fragesteller hat bereits die GCD-Planung der Animationen implementiert. Das ist nicht das Problem. Das Problem ist, dass GCD nach einer bestimmten Zeit den Abstand zwischen den Aufgaben in seiner Warteschlange zu ignorieren scheint - und den gesamten geplanten Vorgang sofort oder in einem einzigen Schritt abfeuern. – user

0

Ihre Frage klingt wie Sie nicht die Animationen und di Aufruf Spatches auf dem Hauptgewinde. Dies führt zu unerwartetem Verhalten, z. B. dass die Ansichten nicht bis zu einem bestimmten Zeitpunkt aktualisiert oder verschoben werden.

Bitte versuchen Sie die Animation Block innerhalb eines dispatch_main zu bewegen wie so:

dispatch_async(dispatch_get_main_queue(), ^{ 
    <# Code #> 
}); 

und sehen, ob es das Problem behebt.

+0

Ich rufe alle geplanten Operationen auf dem Hauptthread auf. Ich denke nicht, dass sich die Animationen anfangs verhalten würden, wenn dies nicht der Fall wäre. – user

Verwandte Themen