2012-04-09 9 views
0

Ich versuche, einige Daten in einer Klasse zu speichern genannt MyPos.h zu implementieren, die die NSCoding Methoden verwendet:wie applicationWillTerminate in appDelegate.m

  • (void)encodeWithCoder:(NSCoder *)aCoder
  • (id)initWithCoder:(NSCoder *)aDecoder

Diese In der MyPos.m-Datei wurden zwei Methoden implementiert.

Jetzt möchte ich die Anwendung die Daten speichern, wenn es beendet und Daten laden, wenn es fertig gestartet ist. Ich möchte die to-Methoden in der AppDelegate.m-Datei implementieren, aber ich kann nicht umgehen, wie Sie die Instanz der MyPos-Klasse speichern, die die Daten enthält.

Dies ist einer der beiden Methoden in der AppDelegate.m Datei ... so weit:

- (void)applicationWillTerminate:(UIApplication *)application { 


NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 

[archiver encodeObject: **HELP_HERE!** forKey:@"myPos"]; 
[archiver finishEncoding]; 

[data writeToFile:[self dataFilePath] atomically:YES];} 

Wie kann ich dieses Problem lösen? Vielen Dank im Voraus.

+0

Haben Sie eine Instanz der MyPos-Klasse in Ihrem App-Delegaten? Speichern Sie die Instanz ... – jmstone617

+0

'' applicationWillTerminate'' ist irgendwie nutzlos. Sie sollten Ihre Schreibroutinen besser in '' applicationWillEnterBackground'' oder "so bald wie möglich" implementieren. Ab iOS 4 erhält Ihre App beim Drücken der Home-Taste kein '' applicationWillTerminate''. Wenn sich Ihre App im Hintergrund befindet und aus irgendeinem Grund die App nicht mehr funktioniert, erhalten Sie nicht "applicationWillTerminate". –

+0

Ich habe drei Klassen. AppDelegate, MyPos und ViewController. ViewController erstellt eine Instanz von MyPos, um die Daten zu speichern. Das AppDelegate erstellt auch eine Instanz von MyPos, um das Objekt zu speichern. Wenn ich jedoch am Ende von applicationDidEnterBackground ein NSLog hinzufüge, um die Eigenschaften der MyPos-Instanz zu überprüfen, kommen alle aus Null. Ich habe das Gefühl, dass ich es mit zwei verschiedenen Objekten zu tun habe - oder zumindest fehlt ein Link. Irgendwelche Gedanken? Vielen Dank. – gotfunk

Antwort

1

Ich denke, Sie sollten diesen Code in "ApplicationWillEnterBackground" -Methode schreiben, weil wenn App im Hintergrund und Benutzer kill es dann Ihren Code, der in ApplicationWillTerminate ist möglicherweise nicht funktioniert.

2

Zwei Dinge:

  1. Aber für die **HELP_HERE!** sieht Ihr Sparverfahren in Ordnung. Ersetzen Sie diesen Platzhalter durch einen Verweis auf die Instanz MyPos, die die Daten enthält. Wie Sie auf diese Instanz verweisen, hängt davon ab, wie in Ihrem App-Delegaten auf sie verwiesen wird. Ist es eine Eigenschaft oder ein Ivar? Verwende das. Gehört es zu einem anderen Objekt in Ihrem Programm (zB einem View-Controller)? Siehe unten.

  2. Beachten Sie, dass in den meisten Fällen * auf iOS 4 oder höher, Ihre Anwendung wird nie die willTerminate Ereignis sehen - Sie willResignActive und didEnterBackground sehen werden, aber wenn das Betriebssystem Ihrer Anwendung zu beenden, geht da Es benötigt mehr RAM, Ihre App ist bereits gesperrt und Sie haben keine Chance mehr auf dieses Ereignis zu reagieren. Wahrscheinlich möchten Sie Ihre Speicherung als Reaktion auf das Ereignis didEnterBackground durchführen. (Obwohl Sie auch vielleicht erwägen Speichern, sobald sich die Daten ändern.)

Jede dieser „Ereignisse“ Ich erwähnt habe, ist etwas, das Sie entweder via an app delegate message reagieren können oder by subscribing to a notification - Nutzung je nachdem, was zu angemessen ist Ihre Lage. Wenn die Daten, die gespeichert werden müssen, von einem anderen Objekt als dem Anwendungsdelegaten (z. B. einem Ansichtscontroller) verwaltet werden, ist es möglicherweise sinnvoller, das Objekt als Antwort auf eine Benachrichtigung speichern zu lassen.

Weitere Details finden Sie unter here's a good overview der Anwendungslebenszyklusereignisse in iOS 4+.


(*) Beachten Sie, dass Sie noch willTerminate bekommen wenn a) Sie eines der unterstützten Hintergrund Ausführungsmodi verwenden, wie Audio oder VoIP-Dienst zu spielen, b) die App für ein SDK kompiliert vor 4.0 oder c) Sie haben den Schlüssel UIApplicationExitsOnSuspend in Ihrer Info.plist auf YES gesetzt.Diese letzte Option bedeutet jedoch, dass Sie die Vorteile der Suspend/Resume-Funktion aufgeben.

Verwandte Themen