Ich mache eine iPhone-App, die ihre Daten von einem WCF-Dienst erhält, den ich gerade schreibe und hosste. Ich benutze MonoTouch, um den iPhone-Client zu schreiben. Ich habe einen Tisch auf einem meiner Bildschirme, der eine Liste von Gegenständen zeigt (höchstens 100 Stück). Für jedes Element wird ein Bild angezeigt, das in der benutzerdefinierten Zelle angezeigt werden soll. Um nicht alle Bilder laden zu müssen, lade ich zunächst die Liste der Elemente und feuere dann einen Thread ab, der einen Dienst aufruft, um jedes Zellenbild in der GetCell-Methode abzurufen. Sobald das Bild abgerufen wurde, speichere ich es in einem Wörterbuch und lade es von dort aus, wenn die Zelle das nächste Mal gerendert wird, um einen zweiten Serviceanruf zu speichern. Dies bedeutet, dass das Bild nur bei Bedarf einmal aus dem Dienst und dann aus dem Wörterbuch geladen wird. Ich verwende einen Code ähnlich dem im folgenden Artikel; Monotouch - Viele WCF-Service-Anrufe
Das funktioniert gut in dem Emulator, aber wenn ich es auf ein Testgerät einsetzen (ein iPhone 4 auf lokale WiFi) ich einige Probleme auftreten, die ich jemand bin die Hoffnung, kann mir helfen mit.
Wenn ich die Liste anfänglich laden, ist alles gut. Wenn ich die Liste ganz nach unten scrolle (wische schnell mit dem Finger nach oben), stottert das Gerät ziemlich schlecht. Es sieht so aus, als würde der Aufruf des Dienstes den Bildlauf verzögern. Ich habe den Code herausgenommen, der das resultierende Bild auf die Zelle zeichnet, um dies von der Routine abzuziehen, da ich vermutete, dass dies der Übeltäter wäre, aber es ist immer noch ein Zitat von Laggy. Ich rufe meine "GetImage" -Methode mit der ThreadPool.QueueUserWorkItem-Methode auf und übergebe einen Verweis auf meinen benutzerdefinierten Zellencontroller, sodass ich erwartet habe, dass der Aufruf an einen anderen Thread gesendet wird. Dann sollte das Programm weitergehen und die Benutzeroberfläche nicht unterbrechen. Aber ich frage mich, ob ich Probleme mit der virtuellen Liste habe, wenn ich den Verweis auf den Zellencontroller übergebe.
Zweitens, wenn ich schnell die Liste auf und ab scrollen, so dass eine Ladung von Anrufen gemacht wird und dann zurück zu meinem vorherigen Bildschirm, um die Listenkriterien zu ändern, sieht es so aus, dass ich warten muss, bis die bestehenden Anrufe gewesen sind zurückgegeben, bevor ich eine weitere auf meiner Kriterienseite erstellen kann - was länger dauert, als ich möchte. Gibt es eine Möglichkeit, die bestehenden Anrufe zu verwerfen, wenn ich vom Bildschirm weg navigiere, da sie nicht mehr benötigt werden?
Vielen Dank im Voraus für jede Hilfe.
Al.
Für zukünftige Referenz möchten Sie vielleicht Miguel's ImageLoader-Klasse, die alle oben genannten für Sie tun wird: https://github.com/miguelleicaza/MonoTouch.Dialog/blob/master/MonoTouch.Dialog/Utilities/ImageLoader .cs – Darbio
Es hängt wirklich von den Besonderheiten ab, wie Sie Dinge tun. UITableViews können abgehackt werden, wenn sie nicht ordnungsgemäß implementiert werden. Dies ist das Thema umfangreicher Präsentationen zur Optimierung und Vermeidung von Fallstricken in diesem Bereich. –