In Kapitel 9 weitere iPhone Entwicklung schrieben wir einen Satz von Klassen, die imitiert das Verhalten der Verbindungen, Peer-to-Peer in der GameKit, aber für regelmäßige Netzwerkverbindungen (GameKit, arbeitet nur mit BlueTooth und verbinden mit dem lokalen Netzwerk). Grundsätzlich eine Klasse schreiben, die Ihnen erlaubt, zu senden und empfangen, die in einer Instanz der NSData verpackt werden können. Es relativ einfach für die meisten Klassen implementieren ist, wird NSCoding Übertragung von Objekten zwischen zwei apps iOS (iOS oder Mac app) bedeutet ganz einfach. Sie müssen nicht auf Abfragen für Daten, oder sich Sorgen über die Datenblöcke. Sie müssen nur die Methode aufrufen, und übergeben Sie die Instanz NSData zum Senden der Daten, und dann implementieren die Delegatmethode, um Daten vom anderen Ende erhalten. Ist Leben gut, nicht wahr?

Hmm…

Vielleicht ist nicht. eine große Einschränkung bei der Umsetzung des Buches. Diese Implementierung, bestimmt für die Übertragung von kleinen Datenpaketen (TicTacToe Spiel Strokes), immer noch alle im Arbeitsspeicher. Wenn Sie versuchen, eine gutes Image-Größe für andere Verbindungen senden, würde wahrscheinlich relativ schnell der Arbeitsspeicher ausgehen.

Ich möchte nur die Situation, die er konfrontiert. Für Kiosk-app MartianCraft schrieb für einen Client zu senden große Bilder mit DSLR-Kamera aus Ihrem Mac Kakao iPad Programm und auch die Fotos von der Kamera iPad zurück zu Firefox-Mac-Kakao senden musste. Diese Bilder komprimiert, eine Waffe von der who ca. 5 MB. Ich nahm die Klasse OnlineSession aus mehreren, Netzwerk-Code wurde im wesentlichen fertig und sah wie mein Wunsch zu gehen in glänzender gut … von … Nein, das ist sicher. Sie sind nicht nur iPad Speicher, Mangel an Arbeitsspeicher ist schnell… schneller als ich erwartet hatte. Auch die kleineren Bilder Kamera iPad oft Ursachen aus der Erinnerung senden stürzt.

Wenn Sie versuchen, verwenden Sie, um größere Datenmengen senden, waren die zwei grundlegende Probleme mit der OnlineSession-Klasse. Erstens, wie gesagt, war, dass, die nur auf den physischen Speicher verlassen. Während die körperlichen Einschränkungen der ursprünglichen iPad, problematisch war. Aber es gab einen anderen, viel größeren Problem.

Das zweite Problem war während des Prozesses der Blöcke, die Daten zu senden, den Code enthalten, der ständig die unnötigen Kopien der Daten. Einfach ausgedrückt, n00b Fehler. Ich bin Auswirkungen, weil das Spiel TicTacToe Schritte sind leicht im Sendepuffer platziert, aber dies ein Fehler ist, Fehler früher gemacht und sicherlich erraten haben sollte.

Also, was insbesondere diese Sicherheitsanfälligkeit, Fragen Sie?

Mit NSData des regulären Komfort-Konstruktor DataWithBytes: Länge: beim Erstellen einer neuen Instanz der NSData Speicher Teil des Bildes, das passt nicht in den Sendebuffer. Wenn Sie die Beschreibung der DataWithBytes lesen: Länge:, sehr deutlich sagt, die erstellt eine Kopie der Daten, die Sie zur Verfügung stellen. So dass jedes Mal, wenn ein einzelnes Paket gesendet wurde, würde der Code erstellt eine neue Instanz der Rest der Masse in die NSData verwalten Puffer, würde alle restliche noch nicht gesendete Daten für jedes Paket kopieren. Die Au.

Also, ein einfaches Beispiel, wenn wir 5 Meg Bild senden waren und der Übertragungspuffer wurde auf 128 kb, Sie den Code 4.825 Meg kopieren würde, nachdem das erste Paket gesendet wird, dann die zweite Kopie für gesendetes 4.265 Meg Kopie nach des dritten Pakets von 4,75 Meg und so weiter. Nachdem jedes Paket für eine kleinere Kopie der Daten absteigend Prozess durchgeführt wurde die Speicher schnell essen sollte.

Nach viel fluchen habe ich einige Änderungen zur Klasse zwei Dinge tun.

Zunächst einmal, ich ging zu den NSData in DataWithBytes: “NOCOPY”: Länge:, der verwendet wird, der Angaben auf der Website ohne eine Kopie zu erstellen. Es ist immer noch die viel kleineren Speicherbedarf. In einigen Fällen weil die DSLR-Bilder so enorm waren, und unsere Programme erforderlich, so viel zu senden, noch getroffen Sie Probleme mit Speicher. Das zweite, was ich tat war hinzufügen zum Cache ausgehende Warteschlange, also Dateien, die alle die codierte Objekte darauf warten, gesendet werden, nicht zu passen in den Speicher für die Anwendung ordnungsgemäß funktioniert.

Neue Version der Klassenfunktion genau wie die aus dem Buch, so dass Sie nur können ersetzen die Drop-in OnlineSession aus Kapitel 9 mit diesem ohne Änderungen im Code der Anwendung.

Sie können die neue Version hier herunterladen.

Another blog post that you may be interested in is Developing IPhone First Application.

You can hire a iPhone Developer or a team of iPhone developers here.

Permalien | Laisser un commentaire »

]]>