2012-03-26 12 views
0

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

http://simon.nureality.ca/simon-says-monotouch-downloading-images-like-appstore-app-in-less-than-50-lines-with-coreanimation-transitions/

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.

+0

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

+0

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. –

Antwort

1

Angenommen, statische Bilddateien funktionieren für Ihren Anwendungsfall, würde ich vorschlagen, dass Sie alle Bilder auf Ihrem Webserver speichern und sie direkt als URL zugänglich machen. Um das Image abzurufen, gehen Sie direkt zu WebClient class und umgehen den gesamten WCF-Overhead.

Als allgemeine Optimierung möchten Sie möglicherweise einen HTTP-basierten Dienst erstellen, der etwas wie das neue ASP.NET 4 Web API-Framework verwendet, das direkt über HTTP statt dem Erstellen eines seifenbasierten WCF-Dienstes ermöglicht.

0

Wir haben eine Lösung implementiert, die den http-Handler ashx verwendet, um ein Bild basierend auf der Querystring an einer bestimmten URL zurückzugeben.

Wir dann Miguel's Image Loader verwenden, das Caching aussondert usw.

Ich glaube nicht, dass aus der Box, die ImageLoader Bilder von einem WCF-Aufruf unterstützt, sondern (wie Sixto Saez angegeben) kann es mehr sein effizient, um die Bilder als Bilder und nicht in SOAP-Nachrichten bereitzustellen.