2 Stimmen

Wie kann man die Benutzeroberfläche immer ansprechbar machen und im Hintergrund aktualisieren?

Ich erstelle eine Anwendung, die 8 Miniaturbilder pro Seite anzeigt und n Seiten haben kann. Jede dieser Miniaturansichten sind UIViews und werden zu UIScrollView hinzugefügt. Allerdings habe ich Paging mit dem Apple Beispielcode implementiert.

Die Wahrscheinlichkeit:

  1. Jede Miniaturansicht (UIView) benötigt 150 Millisekunden zum Erstellen und Hinzufügen zur Ansicht scrollen
  2. Daher braucht es für 3 Seiten schrecklich sehr viel Zeit, um erstellt und zur der UI Scrollview.
  3. An dieser Stelle ist die Scroll-Ansicht nicht sehr reaktionsschnell, ruckelt stark und bietet eine schlechte Benutzererfahrung
  4. Wie kann ich die Miniaturansichten erstellen und sie zu UIScrollview hinzufügen, ohne die Berührungsempfindlichkeit zu beeinträchtigen? Ich möchte, dass sie unabhängig von der Haupt-Thread laufen, die für die Behandlung von Touch-Ereignissen verantwortlich ist (ich nehme an).

Auch möchte ich erwähnen, dass, wenn ein Thumbnail erstellt wird ich einen Async-Download des Bildes auslösen und die Delegate-Methode aufgerufen wird, wenn der Download abgeschlossen ist.

Lassen Sie mich wissen, die Optionen, die ich haben, um diese mehr reaktionsschnell und aktualisieren UI ohne Auswirkungen auf die Touch-Operationen zu machen. Die Seite Steuerung funktioniert gut mit Lazy Laden des Gitters von Thumbnails.

TIA,

Praveen S

0 Stimmen

Das passiert, wenn man die gleiche Frage zweimal stellt. Die Leute fangen an, dafür zu stimmen, beide Fragen als Duplikate zu schließen, und am Ende werden sie beide geschlossen.

0 Stimmen

Hey, es war ein Problem mit meinem Internet und deshalb habe ich die Frage zweimal gepostet, bevor ich das vorherige Update sehen konnte. Werde von nun an vorsichtig sein. Freue mich auf eine gute Lösung :-)

10voto

Kazuki Sakamoto Punkte 13924

Grand Central Dispatch ist für das Laden im Hintergrund einfach zu bedienen. Aber GCD ist nur für nach iOS4. Wenn Sie iOS3 unterstützen müssen, sind performSelectorInBackground/performSelectorOnMainThread oder NSOperationQueue hilfreich.

Und, seien Sie vorsichtig fast UIKit Klassen sind nicht thread-safe außer Zeichnung zu einem Grafik-Kontext. Zum Beispiel, UIScrollView ist nicht thread-sicher, UIImage imageNamed: ist nicht thread-sicher, aber UIImage imageWithContentsOfFile: ist thread-sicher.

dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_queue_t concurrentQueue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(concurrentQueue, ^{

    dispatch_apply([thumbnails count], concurrentQueue, ^(size_t index) {

        Thumbnail *thumbnail = [thumbnails objectAtIndex:index];
        thumbnail.image = [UIImage imageWithContentsOfFile:thumbnail.url];

        dispatch_sync(mainQueue, ^{

            /* update UIScrollView using thumbnail. It is safe because this block is on main thread. */

        });
    }

    /* dispatch_apply waits until all blocks are done */

    dispatch_async(mainQueue, ^{
        /* do for all done. */
    });
}

0voto

SNR Punkte 1249

Ich hatte ein ähnliches Problem.
Was ich gemacht habe, war, dass ich bei einer Instanz nur 3 Seiten im Speicher behalten habe und die restlichen alle gelöscht habe.
Angenommen, es gibt 3 Bildschirme s1, s2, s3. Und der Benutzer sieht s2. Immer wenn er zu s3 scrollt, wird s1 entfernt und eine neue Seite s4 geladen.
So haben die Benutzer eine bessere Erfahrung. Und es wird weniger Speicherplatz benötigt.

0voto

tester1 Punkte 61

Unabhängig davon, ob Sie eine Unteransicht oder einen separaten ViewController für jede "Seite" oder jedes Element des Scrollviews verwenden, kann das Ruckeln oder die schlechte Leistung durch eine Änderung der Position Ihres Codes behoben werden.

Insbesondere der Apple-Beispielcode für eine Scrollview mit Pagecontrol hat etwas wie dieses:

[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];

Allerdings erscheint dieser Code in ihrem Beispiel in der Methode "scrollViewDidScroll". Er versucht, mehrere schwere Aufgaben zu erledigen, indem er gleichzeitig scrollt und lädt. Selbst wenn Ihre Bilder lokal sind, ist dies unangenehm.

Wenn Sie diesen und den zugehörigen Code, einschließlich eines Verweises auf die aktuelle Seite, nach "scrollViewDidEndDecelerating" verschieben, wird das Ruckeln der Schnittstelle behoben, da das Laden erfolgt, während sich die Bildlaufansicht nicht mehr bewegt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X