読者です 読者をやめる 読者になる 読者になる

Swift で MagicalRecord を使う手順メモ

swift

CocoaPods で MagicalRecord をインストール

Podfile に

pod "MagicalRecord"

を追加し

pod install

でインストール。

<アプリ名>-Bridging-Header.h に

#import <MagicalRecord/CoreData+MagicalRecord.h>

を記述して、Swift から MagicalRecord を使えるようにする。

なお、Bridging-Header を作る手順は先日の記事で書いた。

xcdatamodeld を作成

プロジェクト作成時に CoreData を使う選択をしていれば、 <プロジェクト名>.xcdatamodeld ファイルが作成されているので、 Xcode でエンティティを定義する。 その際、エンティティに対応する NSManagedObject サブクラスも指定。

f:id:griefworker:20141023000747p:plain

NSManagedObject のサブクラスを作成

プロジェクトに NSManagedObject のサブクラスを追加する。 先ほど作成したエンティティに対応するクラスを Swift で生成。

import Foundation
import CoreData

@objc(Favorite)
class Favorite: NSManagedObject {

    @NSManaged var login: String
    @NSManaged var owner: String
    @NSManaged var name: String
    @NSManaged var slug: String
    @NSManaged var createdAt: NSDate
    @NSManaged var updatedAt: NSDate
    @NSManaged var order: NSNumber

}

CoreData スタックのセットアップ

MagicalRecord を使って CoreData を初期化するコードを AppDelegate に記述する。 Xcode が生成した CoreData 関連のひな形は削除。

import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // CoreData スタックを初期化
        MagicalRecord.setupCoreDataStackWithStoreNamed("Bitissues.sqlite")

        // ...省略...

        return true
    }

    // ...省略...
}

これで準備完了

あとは Objective-C のときと同様に MagicalRecord が使える。 試しに、NSFetchedResultsController を取得してみるコードがこちら。

import Foundation
import CoreData

extension Favorite {
    class func fetchAllWithLogin(login: String, delegate: NSFetchedResultsControllerDelegate?) -> NSFetchedResultsController {
        let predicate = NSPredicate(format: "login = %@", login)
        return Favorite.MR_fetchAllSortedBy(
            "order",
            ascending: true,
            withPredicate: predicate,
            groupBy: nil,
            delegate: delegate
        )
    }
}