深入浅出MagicalRecord-04

7202 ワード

この節では、MagicalRecordのデータの格納について学びます.主にMagicalRecordのgithub資料から来ています.

ストレージのタイミング


一般的には、データが変化したときにストレージ操作を行う必要があります.一部のアプリケーションでは、終了時に格納する選択がありますが、ほとんどの場合、これは必要ありません.実際には、アプリケーションが終了したときにストレージを行うだけで、データが失われる可能性があります.もしあなたのアプリケーションがクラッシュしたら?ユーザーは変更したデータを失うことになります.これは悪い体験です.このような状況を極力避けるべきです.
ストレージに時間がかかる場合は、次の点を考慮してください.
1.バックグラウンドスレッドによる格納
MagicalRecordは、バックグラウンドスレッドによるエンティティの変更を操作するための簡潔なAPIを提供します.例:
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    // , 

} completion:^(BOOL success, NSError *error) {
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

2.ストレージタスクを小さなストレージに分割
大量のデータをインポートするようなタスクは、複数の小さなモジュールに分割されるべきです.一度にどれだけのデータを格納するかは統一的な基準ではありませんので、Apple's Instrumentsを使用してアプリケーションのパフォーマンスをテストする必要があります.

ロングストレージの処理


iosプラットフォーム


iosアプリケーションを終了すると、ディスクにデータを整理および格納する機会があります.ストレージ・オペレーションがしばらく続くことを知っている場合は、アプリケーションの延期終了を要求するのが最善です.次のようになります.
UIApplication *application = [UIApplication sharedApplication];

__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    // 

} completion:^(BOOL success, NSError *error) {
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

確実にread the documentation for beginBackgroundTaskWithExpirationHandlerをお読みください
アプリケーションのライフサイクルを不適切または不要に延長すると、レビュー時に拒否される可能性があります.

OSXプラットフォーム


OS X Mavericks(10.9)および以降のバージョンでは、App Napは、アプリケーションがバックグラウンドにあるときに効果的に終了して終了することができる.ストレージ操作がしばらく続くことを知っている場合は、自動終了機能と突然終了機能を一時的に無効にすることが最善です(アプリケーションがこれらの機能をサポートしていることを前提としています):
NSProcessInfo *processInfo = [NSProcessInfo processInfo];

[processInfo disableSuddenTermination];
[processInfo disableAutomaticTermination:@"Application is currently saving to persistent store"];

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    // 

} completion:^(BOOL success, NSError *error) {
    [processInfo enableSuddenTermination];
    [processInfo enableAutomaticTermination:@"Application has finished saving to the persistent store"];
}];

ios実装と同様に、実装前にread the documentation on NSProcessInfoを確実に読む
拒否されないようにする.

へんか


MagicalRecord 2.2では、ストレージAPIがより一貫性があり、CoreDataのネーミングモードに従う.このバージョンでは、将来の更新時にストレージ作業(新しいAPIと廃棄されたAPI)が継続できるように自動化テストが追加されています.MR_saveは、現在のスレッドの同期実行および永続ストレージ(persistent store)の元の状態に一時的に復元される.しかしながら、MR_saveメソッドは「廃棄される」(deprecated)と表記されており、次のバージョンのMagicalRecord 3.0では削除される.MR_saveToPersistentStoreAndWait同機能関数を使用して代替する必要があります.

a)新しい方法


次の方法が追加されました.

NSManagedObjectContext+MagicalSaves

- (void) MR_saveOnlySelfWithCompletion:(MRSaveCompletionHandler)completion;
- (void) MR_saveToPersistentStoreWithCompletion:(MRSaveCompletionHandler)completion;
- (void) MR_saveOnlySelfAndWait;
- (void) MR_saveToPersistentStoreAndWait;
- (void) MR_saveWithOptions:(MRSaveContextOptions)mask completion:(MRSaveCompletionHandler)completion;

MagicalRecord+Actions

+ (void) saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block;
+ (void) saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block completion:(MRSaveCompletionHandler)completion;
+ (void) saveWithBlockAndWait:(void(^)(NSManagedObjectContext *localContext))block;
+ (void) saveUsingCurrentThreadContextWithBlock:(void (^)(NSManagedObjectContext *localContext))block completion:(MRSaveCompletionHandler)completion;
+ (void) saveUsingCurrentThreadContextWithBlockAndWait:(void (^)(NSManagedObjectContext *localContext))block;

b)廃棄と表記された関数


以下の関数は「廃棄された」とマークされ、MagicalRecord 3.0で削除され、代替の関数の使用を推奨します.

NSManagedObjectContext+MagicalSaves

- (void) MR_save;
- (void) MR_saveWithErrorCallback:(void(^)(NSError *error))errorCallback;
- (void) MR_saveInBackgroundCompletion:(void (^)(void))completion;
- (void) MR_saveInBackgroundErrorHandler:(void (^)(NSError *error))errorCallback;
- (void) MR_saveInBackgroundErrorHandler:(void (^)(NSError *error))errorCallback completion:(void (^)(void))completion;
- (void) MR_saveNestedContexts;
- (void) MR_saveNestedContextsErrorHandler:(void (^)(NSError *error))errorCallback;
- (void) MR_saveNestedContextsErrorHandler:(void (^)(NSError *error))errorCallback completion:(void (^)(void))completion;

MagicalRecord+Actions

+ (void) saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block;
+ (void) saveInBackgroundWithBlock:(void(^)(NSManagedObjectContext *localContext))block;
+ (void) saveInBackgroundWithBlock:(void(^)(NSManagedObjectContext *localContext))block completion:(void(^)(void))completion;
+ (void) saveInBackgroundUsingCurrentContextWithBlock:(void (^)(NSManagedObjectContext *localContext))block completion:(void (^)(void))completion errorHandler:(void (^)(NSError *error))errorHandler;