Giter VIP home page Giter VIP logo

na_ios_coredata's Introduction

na_ios/coredata

na_ios/coredataは、扱うのに経験が必要なcoredataを、簡単に扱えるようにするモジュールです.

データの正しさとパフォーマンスの良さを両立するため、多くのAPIの内部ではスレッドを使い、なおかつ、それを隠蔽しています.

例えば、TestObjectというNSManagedObjectのクラスがあった場合、

[TestObject filter:@{@"name": @"test"} options:nil complete:^(NSArray *mos) {
    // 色々処理
}];

このように非同期メソッドのcompleteハンドラに結果が渡されます.またcompleteハンドラはmain threadで返ってくるため、ハンドラ内でUIの処理をしても、問題が無いようになっています. 非同期メソッドにはfilterの他に、creategetget_ore_createなどのAPIがあります.

[TestObject create:@{@"name": @"test2"} options:nil complete:^(id mo) {
	// hogehoge
}];

[TestObject get_or_create:@{@"name": @"test"} options:nil complete:^(id mo) {
	// hogehoge
}];

createget_or_createはcontextに変更を加える可能性がありますが、その場合は、TestObjectに登録したmainContext(main thread上のcontext)に変更がマージされてからcompleteハンドラは呼ばれます.そのため、completeハンドラ内でUIを更新すると、変更分も表示されることになります.

また、同じようにして、ハンドラを渡さない同期メソッドもあります.

TestObject *obj = [TestObject create:@{@"name": @"test"} options:nil];
NSArray *objs = [TestObject filter:@{@"name": @"test"} options:nil];
TestObject *obj2 = [TestObject get_or_create:@{@"name": @"test"} options:nil];
Bool bl = (obj == obj2); => YES

最後に、独自にcoredata上でスレッドを作成したい上級者向けには、次のようなメソッドがあります.

[mainContext performBlockOutOfOwnThread:^(NSManagedObjectContext *context){
    // !!!!!!ここでいろいろと変更を加える!!!!!!
    [context save:nil];
} afterSaveOnMainThread:^(NSNotification *note) {
    // !!!!!!終了処理!!!!!!
}];

performBlockOutOfOwnThread:^(NSManagedObjectContext *context)block afterSaveOnMainThread:^(NSNotification *note)saveは、main thread上のcontextからしか呼び出すことを考慮していない事に注意して下さい. またblockハンドラはmain threadじゃなく、saveハンドラはmainThreadであることにも注意して下さい. saveハンドラはmainContextに変更がマージされた後に呼び出されるため、saveハンドラ内で(mainContextにつなげてある)UIを更新することで、変更分も表示することができます.

これは次の処理のラッパーになっています.

NSManagedObjectContext *mainContext = [ModelController sharedController].mainContext;
NSPersistentStoreCoordinator *coordinator = mainContext.persistentStoreCoordinator;
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setPersistentStoreCoordinator:coordinator];
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:context queue:nil usingBlock:^(NSNotification *note) {
    [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                                  withObject:note
                               waitUntilDone:YES];
    dispatch_async(dispatch_get_main_queue(), ^{
        // !!!!!!終了処理!!!!!!
    });
}];

[context performBlock:^{
    // !!!!!!ここでいろいろと変更を加える!!!!!!
    [context save:nil];
}];

設定方法

現状のところ、na_ios/coredataを使うにはna_ios([email protected]:nashibao/na_ios.git)ごとcloneしてくるしかありません.

設定方法は以下のようになります.

ModelControllerクラスの実装とNSManagedObjectのサブクラスであるTestObjectのカテゴリの実装をするだけです.

#import "NAModelController.h"
@interface ModelController : NAModelController
+ (ModelController *)sharedController;
@end

#import "SingletonMacros.h"
#import "ModelController.h"
@implementation ModelController
SHARED_CONTROLLER(ModelController)
- (NSString *)name{
    return @"hoge";
}
@end
#import "NSManagedObject+na.h"
@interface TestObject(na)
@end

#import "TestObject+na.h"
#import "ModelController.h"
@implementation TestObject (na)

+ (NSManagedObjectContext *)mainContext{
    return [[ModelController sharedController] mainContext];
}
@end

ModelControllerの名前には、modeldの名前を入れて下さい.(hoge.xcdatamodeldならばhogeです.この場合hoge.sqliteにデータは保存されます.) これで晴れてna_ios/coredataの全ての機能を使う事が出来ます.

個々のパッケージ

coredata/categories

コアデータに関わる各種クラスのカテゴリが入っているパッケージになります.

NSFetchRequest, NSManagedObjectContext, NSPredicate, NSManagedObjectの4種類に対応しています.まずはNSManagedObjectだけを使うのが良いでしょう.

categories/NSManagedObject+na

moにCRUD操作を生やすためのカテゴリ.blockによるcallbackを引数に持つものは非同期で、メインスレッドに返ってくきます.

categories/NSFetchRequest+na

categories/NSManagedObjectContext+na

contextにCRUD操作を生やすためのカテゴリ.categories/NSManagedObject+naで利用しています.

categories/NSPredicate+na

NSDictionaryか、NSArrayからPredicateを作成するもので、NSDictionaryの方は@"%K == %@", key, valで評価し、NSArrayの方は、評価式を順番に入れておくショートカットを持っています.基本的には上記の3つのクラスを用いてNSPredicateを直接は触らないようにするのが得策です.

coredata/controllers

controllers/NAModelController

modeldファイル(hoge.modeld)の名前(hoge)をnameに設定して、setup()を呼べば、以下のことをやってくれます.

  • coordinatorの作成
  • bundleからの初期コピー(bundle内にhoge.sqliteファイルを入れておけば、初期状態としてそちらを使う.でかいデータの時に便利)
  • mainthread上のcontextの作成

またdestroyAndSetupを呼ぶと、sqliteファイルを削除して、もう一度最初からやり直すことができます.

coredata/models

models/NSDictionaryTransformer

dictionaryとsqlite内のバイナリを自動変換するクラス

magicalpanda/MagicalRecordとの比較

同じような目的のモジュールに、magicalpanda/MagicalRecordがあります.magicalpanda/MagicalRecordの“Performing Core Data operations on Threads“の章も合わせて参照して下さい.

magicalpanda/MagicalRecordでは、filteringやsortingにメリットがあります.na_ios/coredataに含まれていないような複雑なフェッチを行うことができます. これに対して、na_ios/coredataでは複雑なfilteringやsortingを介するフェッチにはNSFetchedResultsController経由で行い、NSArrayを介さない方法を推奨しています.これは、UITableViewControllerなどと併用する場合、パフォーマンスとメモリの観点において都合が良いからです.

NSFetchedResultsControllerUITableViewControllerna_ios/coredataで使うにはna_ios/coredata_uiを参照して下さい.

na_ios/coredataではフェッチに自由度がない代わりに、フェッチやインサートに非同期のメソッドを持っています.これらを使う事でUIのブロックを防ぐことを念頭におきつつ、複雑なスレッドプログラミングを隠蔽することを目的にしています.

magicalpanda/MagicalRecordも分かりやすいAPIを持ったすばらしいモジュールです.上記の比較事項を念頭に入れて、プログラマはどちらのライブラリを選ぶかを選択することができます.

依存関係

依存元:なし
依存先: na_ios/coredata_ui, na_ios/coredata_sync

na_ios_coredata's People

Contributors

nashibao avatar

Watchers

James Cloos avatar  avatar Masahiko Okada avatar scubism-tech-share avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.