Nurseryを使う準備
前回の記事では、実際にNurseryを使うところまで扱えませんでしたが、
今回は、新しいXcodeプロジェクトを作成し、そのプロジェクトでNurseryを使用します。
プロジェクトの内容は、NSStringのインスタンスを保存するだけの、非常に簡単なものです。
新しいXcodeプロジェクトの作成
新しいXcodeプロジェクトを作成します。
ここでは、プロジェクトの種類からApplicationのAppを選択します。
プロダクト名をMy-First-Nurseryに、言語をObjective-Cに、StorageをNoneにして作成します。
プロジェクトの作成ができました。
Nurseryフレームワークをビルドします
Nurseryのリポジトリを取得
GitHubにアクセスしてNurseryのリポジトリをクローンまたはZIPファイルをダウンロードします。
プロジェクトファイルを開きビルドします。
Nursery.xcodeprojを開きます。
開いたら、XcodeのメニューバーからProduct > Buildを選択して、ビルドします。
ビルドの手順は以上です。
ビルドしたNurseryフレームワークを、新しいプロジェクトにコピーします
ビルドが終わったら、XcodeのメニューバーからProduct > Show Build Folder in Finderを選択して、BuildフォルダをFinderで表示します。
FinderでProducts > Realeaseと開き、Nursery.frameworkを表示させます。
先ほど作成したプロジェクトMy-First-NurseryのProjectナビゲータに、Nursery.frameworkをドラッグ&ドロップします。
次の画面で、Copy items if neededにチェックが入っていることを確認し、Finishボタンを押します。
My-First-NurseryのProjectナビゲータにNurseryが表示されていることを確認します。
その後、Projectナビゲータからプロジェクトファイルを選択し、TARGETSからMy-First-Nurseryを選択し、Generalタブを選択します。
Frameworks, Libraries, and Embedded Contentに表示されているNursery.frameworkのEmbed列の値を、Embed & Signに変更します。
以上でNurseryを使う準備は完了です。
Nurseryを使う
まずは、Nurseryを使って、文字列を保存してみます。
ここからは、My-First-Nurseryプロジェクト上での作業になります。
Projectナビゲータからmain.mを選択します。
初期状態では次のようになっていると思います。
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
}
return NSApplicationMain(argc, argv);
}
それを、以下のように書き換えます。
#import <Cocoa/Cocoa.h>
#import <Nursery/Nursery.h>
void save(void)
{
NSString *aFilepath = [NSHomeDirectory() stringByAppendingPathComponent:@"My-First-Nursery"]; //データベースを保存するファイルパスを取得
NUMainBranchNursery *aNursery = [NUMainBranchNursery nurseryWithContentsOfFile:aFilepath]; //ファイルパスを指定してデータベースオブジェクトを作成
NUGarden *aGarden = [aNursery makeGarden]; //データベースに保存するオブジェクトを管理するオブジェクトを作成
[aGarden setRoot:@"Hello, Nursery!"]; //データベースに保存するルートオブジェクトに文字列を指定
[aGarden farmOut]; //メモリ上のオブジェクトをデータベースファイルに保存
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
save(); //save関数の呼び出し
}
return NSApplicationMain(argc, argv);
}
書き換え後、アプリをビルドして実行します。
データベースの保存先として指定したファイルの上位フォルダをFinderで表示すると、データベースファイルMy-First-Nurseryが作成されています。
確認後、アプリケーションは終了させておきます。
今度はこのデータベースから、先ほど保存したオブジェクトを読み込んでみます。
main.mを次のように書き換えます。
load()関数を追加し、main()関数でsave()ではなく、load()を呼び出します。
#import <Cocoa/Cocoa.h>
#import <Nursery/Nursery.h>
void save(void)
{
NSString *aFilepath = [NSHomeDirectory() stringByAppendingPathComponent:@"My-First-Nursery"]; //データベースを保存するファイルパスを取得
NUMainBranchNursery *aNursery = [NUMainBranchNursery nurseryWithContentsOfFile:aFilepath]; //ファイルパスを指定してデータベースオブジェクトを作成
NUGarden *aGarden = [aNursery makeGarden]; //データベースに保存するオブジェクトを管理するオブジェクトを作成
[aGarden setRoot:@"Hello, Nursery!"]; //データベースに保存するルートオブジェクトに文字列を指定
[aGarden farmOut]; //メモリ上のオブジェクトをデータベースファイルに保存
}
void load(void)
{
NSString *aFilepath = [NSHomeDirectory() stringByAppendingPathComponent:@"My-First-Nursery"]; //データベースを保存するファイルパスを取得
NUMainBranchNursery *aNursery = [NUMainBranchNursery nurseryWithContentsOfFile:aFilepath]; //ファイルパスを指定してデータベースオブジェクトを作成
NUGarden *aGarden = [aNursery makeGarden]; //データベースに保存するオブジェクトを管理するオブジェクトを作成
NSString *aString = [aGarden root]; //データベースに保存されたrootオブジェクトを取得
NSLog(@"root: %@", aString); //ルートオブジェクトをログ出力 root: Hello, Nursery!
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
load(); //load関数の呼び出し
}
return NSApplicationMain(argc, argv);
}
書き換えたら、アプリをビルドして実行します。
Xcodeのコンソールに、root: Hello, Nursery! と表示され、確かにオブジェクトが保存されていることが確認できます。
今回は、NSStringのインスタンスをNurseryに保存しましたが、Nurseryは標準で次のクラスのインスタンスを保存できます。
- NSObject
- NSString
- NSMutableString
- NSArray
- NSMutableArray
- NSDictionary
- NSMutableDictionary
- NSSet
- NSMutableSet
- NSNumber
- NSDate
- NSURL
- NSData
- NSMutableData
- NSIndexSet
- NSMutableIndexSet
- NULibrary B+木を実装したコレクションクラス
- NUCoding(NSCodingではない事に注意) プロトコルを実装したクラス
- NUCoder(NSCoderではない事に注意) のサブクラスを使って永続化処理を実装したクラス
自分で定義したクラスのインスタンスをNurseryに保存できるようにするには、通常、そのクラスにNUCodingプロトコルを実装して永続化処理を実装します。
NUCoderクラスのサブクラスを定義して、そのクラスに永続化処理を実装する事もできますが、NUCoderはソースが提供されていないクラスに、後から永続化処理を追加する目的で使用することを意図しています。
次回
次回は、NUCodingプロトコルを実装したクラスを定義し、そのインスタンスをNurseryに保存する手順を紹介します。