3

Ich habe dieses Problem seit etwa einer Woche betont und versucht, die Ursache für eine langsame, aber stetige Leistungseinbuße der Apple Watch-App aufzuzeigen. Im Laufe von zwei Tagen würde die Benutzeroberfläche meiner App immer träger werden. Ich habe es auf einen Update-Code für Komplikationen eingegrenzt. Selbst wenn ich das Komplikationsupdate auf ein absolutes Minimum reduziere, tritt dieses Problem immer noch auf, wenn auch langsamer als wenn ich die Komplikation mit einigen tatsächlichen Daten aktualisiere. Ich aktualisiere die Komplikation alle 10 Minuten. Sobald die neuen Daten kommt, führen Sie ich einfachDurch die Aktualisierung der Komplikation wird die Leistung der Apple Watch-App in WatchOS3 langsam reduziert

for (CLKComplication *comp in [CLKComplicationServer sharedInstance].activeComplications) { 
    [[CLKComplicationServer sharedInstance] reloadTimelineForComplication:comp]; 
} 

die wiederum ruft:

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler { 
... 
} 

Dies funktioniert gut, die neuen Daten angezeigt wird, aber wenn ein paar Dutzend Mal wiederholt, die UI Reaktionsfähigkeit der Die Haupt-App beginnt merklich zu verschlechtern, und wenn sie etwa hundert Mal wiederholt wird (was in weniger als einem Tag mit 10-minütigen Updates geschieht), verlangsamt sich die Benutzeroberfläche erheblich.

Ich habe nichts Besonderes mit der Komplikationsstruktur - keine Zeitreise, nur die aktuellen Daten anzeigen, und alles ist dafür eingerichtet. Um sicherzustellen, dass ich nicht an der falschen Stelle suchen, habe ich einen Test gemacht, den die Timeline jede Sekunde neu geladen, und in diesem Test mein getCurrentTimelineEntryForComplication sieht wie folgt aus:

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler { 
    handler(nil); 
} 

so gibt es buchstäblich nichts da los , sende einfach den leeren Handler zurück. Doch selbst in diesem Szenario verlangsamt sich die Benutzeroberfläche der Haupt-App nach etwa hundert Aktualisierungen der Timeline sichtbar.

einige andere Dinge zu beachten:

  • Wenn ich die Komplikation nicht bin Aktualisierung der Benutzeroberfläche Performance der App nie verschlechtert, egal wie oft ich es öffnen, oder wie lange ich es verwenden, oder Wie oft wird der Code zum Abrufen von Daten im Hintergrund ausgeführt?

  • Wenn ich dies im Simulator teste, kann ich die Leistungseinbuße nicht erreichen, aber ich kann immer sehen, dass ein kleines, aber stetiges Speicherleck von der Komplikationsaktualisierung kommt (wieder geschieht dies, egal wie einfaches Update kann ich innerhalb der getCurrentTimelineEntryForComplication Methode.

Hat jemand dies bemerkt, und gibt es eine Hoffnung, mit ihm umgehen? Bin ich etwas falsch? Für die Zeit sicher nur ich machen ist, um die Komplikation zu aktualisieren wenn sich die Daten geändert haben, aber das Problem einfach verschoben wird, anstatt es zu lösen

24. Oktober bearbeiten

ich auf eine echte Uhr vorsichtiger Prüfung gemacht haben, und während bevor ich aus irgendeinem Grund nicht den Speicherverlust mit diesem auf einer echten Uhr assoziiert bemerkt haben, habe ich jetzt es auf jeden Fall gesehen geschehen. Das reale Gerät spiegelt das auf dem Simulator gesehene Problem vollständig wider, nur mit einer anderen anfänglichen Menge an Speicherzuweisung.

Noch einmal, ich rufe reloadTimelineForComplication in einer konstanten Schleife auf, und die Komplikation wird mit einer einzelnen Textzeile aus einem zwischengespeicherten Datenobjekt aktualisiert, und der Komplikations-Controller ist ansonsten auf ein Minimum reduziert. Wenn die Komplikation von dem Uhrgesicht entfernt wird, wird der Speicherleck vorhersehbar gestoppt.

Mein Hauptprojekt ist in ObjectiveC geschrieben, aber ich habe den Test mit einem Testprojekt in Swift wiederholt, und es gibt keine Unterschiede. Außerdem besteht das Problem weiterhin bei der neuesten XCode 8.1 GM- und watchOS 3.1-Beta, die mit dem mitgelieferten Simulator geliefert wird, sowie bei einer echten Uhr mit installiertem watchOS3.1.

24. Januar 2017 bearbeitet

Leider bleibt das Problem in watchOS 3.1.3, völlig unverändert. In der Zwischenzeit habe ich mich an die Code-Level-Unterstützung von Apple gewandt, ihnen Beispielcode geschickt und sie haben bestätigt, dass das Problem existiert, und mir gesagt, dass ich einen Fehlerbericht einreichen soll. Ich habe vor ungefähr zwei Monaten einen Fehlerbericht eingereicht, aber bis jetzt ist es noch nicht klassifiziert, was bedeutet, dass es noch niemand angeschaut hat.

31. Januar 2017 bearbeiten

Apple das Problem in watchOS3.2 Beta behoben ist 1. Ich habe die Prüfung worden, sowohl im Simulator und auf reale Uhr. Alles funktioniert gut, keine Speicherlecks oder Leistungseinbußen mehr. Am Ende gab es keine Problemumgehungen dafür, bis sie beschlossen, es zu beheben.

Antwort

4

Apple hat das Problem in watchOS3.2 beta 1 behoben. Ich habe es sowohl im Simulator als auch auf der echten Uhr getestet. Alles funktioniert gut, keine Speicherlecks oder Leistungseinbußen mehr. Am Ende gab es keine Problemumgehungen dafür, bis sie beschlossen, es zu beheben.

0

Ich bemerkte, dass mit der nativen Kalenderkomplikation alles, was ich tue, sehr träge wird. Vielleicht ist es ein Fehler im neuen Watch OS. Nach der Verwendung der Kalenderkomplikation für ein paar Tage ist es unmöglich, dieses Zifferblatt zu verwenden. Selbst wenn ich zu einer anderen Komplikation wechsel und zum Kalender zurückwechsle, wird die Leistung nicht "zurückgesetzt". Die einzige Sache, die löst, ist, die Uhr neu zu starten. (oder vergiss den Kalender und benutze stattdessen eine andere Komplikation)

+0

Ich habe bemerkt, dass Mickey Mouse-Uhr-Gesicht anfangen, Frames zu überspringen, wenn ich Zeitreisen benutze, nachdem ich dieses Zifferblatt seit einiger Zeit aktiv habe. Ich werde versuchen, die Kalenderkomplikation zu deaktivieren und zu sehen, ob das noch passiert. Wenn das Problem das gleiche ist wie in meiner App, sollte es ausreichen, die Kalender-App einfach zu beenden und neu zu starten, anstatt die gesamte Uhr neu starten zu müssen. – Marconelly

+0

Ich habe eine "Lösung" gefunden, so dass Sie nicht neu starten müssen. Ich greife einfach auf die Kalenderoptionen auf meinem iPhone zu und ändere etwas wie Custom und dann zurück zu Mirror. Es scheint, die Leistung zurückzusetzen, aber es löst das Problem nicht. –

+0

Eigentlich war meine wirkliche Lösung, eine App namens EventsWidget zu verwenden. Es hat eine schöne und einfache Kalenderkomplikation, die reibungslos funktioniert. –

Verwandte Themen