コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

SwiftでRealmを使う

はじめに

アプリ内にデータを永続化させる方法として内部的にsqlite3を使うCoreDataは素で使うのはけっこう大変、 CoreDataのORMのライブラリMagicalRecordやSugarRecordを使う方法もある。

RealmはSqlite3ではない高速なDBと、ORMがコミコミで使い方を簡単も簡単(らしい)

Android, iOS含めデファクトスタンダードになるつつあるRealmを使ってみる

ゴール

  • Realmをプロジェクトに含めて設定する
  • Realmを使って読み込み・書込する

動作環境

  • xcode 7.3.1
  • osx 10.11.4
  • carthageを利用しているSwiftのみのXcodeプロジェクトを利用
  • CartfileもXcodeプロジェクトに含まれている

※プロジェクトの設定等はこちらの記事を参照 http://konyu.hatenablog.com/entry/2016/05/20/192759

CarthageでRealmを追加し、プロジェクトで使用可能にする

iOS向けのライブラリをCarthageを利用して取得する

コンソールからXcodeプロジェクトのディレクトリに行きCartfileに以下を追記する

github "realm/realm-cocoa"

Carthageを利用してライブラリのバイナリを取得する

> carthage update --platform iOS realm-cocoa

Xcodeプロジェクトルート/Carthage/Build/iOS の下に書きファイルが作成されていればOK

  • Realm.framework
  • RealmSwift.framework

※ realm-cocoaとライブラリ名を指定してあげないと、Carthageに書いてあるすべてのライブラリを更新使用してしまうので注意が必要

--platformでiOSを指定してもrealmの場合はBuildディレクトリに各プラットフォームにコンパイル済みのRealm.frameworkやRealmSwift.frameworkが作成される。 --no-use-binariesオプションをつけるとソースからコンパイルする このへんはCarthageというよりは各ライブラリのCarthage向けの設定の問題かもしれない

XcodeプロジェクトにRealmのライブラリを紐づける

Xcodeでプロジェクトを起動しプロジェクトファイルを開き、Generalを選択、Embedded Binariesに先ほど作った

  • Realm.framework
  • RealmSwift.framework

を追加する

次に、プロジェクトファイルのBuild Phasesを選択、Run ScriptのInut Filesに以下を追記する

$(SRCROOT)/Carthage/Build/iOS/Realm.framework 
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework

コンパイルが通ったら成功

Realmを使って書き込み・読み取りをする

Realm browserをインストール

書き込みの確認のためにRealm browserをインストールする https://itunes.apple.com/app/realm-browser/id1007457278

Realmモデル作成の準備

XcodeのパッケージマネージャAlcatrazのインストール

HomebrewのようなXcode向けのパッケージマネージャAlcatrazをインストールする http://alcatraz.io/

コンソールから下記の実行して、xcodeを再起動する

curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh

WindowメニューにPackege Manegerの項目が増えていたら成功

RealmPluginをインストールする

先ほど入れたAlcatrazを利用するためにXcodeのWindowメニューPackege Manegerを開く Searchのウインドウに「RealmPlugin」と入れて検索してヒットしたRealmPluginをインストールボタンを押してインストールする インストールが完了したらXcodeを再起動し、新規ファイル追加するメニューに「Realm」があり、その中に「Realm Model Object」が選択できるようになっている

Realmモデルの作成

新しいファイルから「Realm Model Object」を選択しクラス名をRealmTestとする

import Foundation
import RealmSwift

class RealmTest: Object {
    // dynamic修飾子を付けないとあかん、なぜかは説明を読んでも説明に見がわからんので、今のところおまじない
    dynamic var name = ""
    dynamic var number = 0
    
// Specify properties to ignore (Realm won't persist these)
    
//  override static func ignoredProperties() -> [String] {
//    return []
//  }
}

Realmで書き込みをする

アプリ起動時に実行するViewController.swiftのviewDidLoadメソッドに追記する シミュレータを起動して書き込みを行う

import UIKit
import RealmSwift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

         // モデル作成
        let myRealm = RealmTest(value: ["name" : "なまえ", "number": 100])
        
        // デフォルトRealmを取得する(おまじない)
        let realm = try! Realm()
        
        // トランザクションを開始して、オブジェクトをRealmに追加する
        try! realm.write {
            realm.add(myRealm)
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}

Realm browserで書き込みを確認する

Realmで書き込まれれると default.realmファイルというものに書き込まれる。 (たぶんdefault以外にもファイル名を変えられたり複数ファイルを使ったり出来るんだろうがそれはまた別のお話)

Realm browserからシミュレータにあるrealmファイルを開く

realmファイルの場所については以下の記事が詳しいく書いてある http://stackoverflow.com/questions/28465706/how-to-find-my-realm-file/28465803#28465803

Realm browserを起動して、ダイアログでrealmファイルの場所を指定する際には、「Cmd + shift + g」で絶対パスを利用すると便利 /Users/ユーザ名/Library/Developer/CoreSimulator/Devices/デバイスID/data/Containers/Data/Application/アプリID/Documents/default.realm

このように書き込まれているのを確認できる。

スクリーンショット 2016-05-22 15.28.35.png

Realmで読み取りをする

書き込みをしたコードの直下に、読み取り部分のコードを追加する

import UIKit
import RealmSwift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

         // モデル作成
        let myRealm = RealmTest(value: ["name" : "なまえ", "number": 100])
        
        // デフォルトRealmを取得する(おまじない)
        let realm = try! Realm()
        
        // トランザクションを開始して、オブジェクトをRealmに追加する
        try! realm.write {
            realm.add(myRealm)
        }
        // 追記 読み取り部分//////
        let objs = realm.objects(RealmTest).filter("number == 100")
        if let obj = objs.first {
            print(obj)
        }
        // 追記終わり
    }
}

コンソール画面にprint出力した結果が表示される。

RealmTest {
    name = なまえ;
    number = 100;
}

refs: https://realm.io/jp/docs/swift/latest/

あわせて読みたい

XcodeでGitのリモートリポジトリでソース管理する(Carthage対応)

はじめに

OSSライブラリを利用するのにCarthageを使ったXcodeのプロジェクトを作成した場合にCarthageのライブラリ設定をまるごとリモートリポジトリで管理して 他のメンバーもGit cloneしたら利用できるようしたい。

ゴール

先日作ったiOSのシングルページアプリケーションのXcodeプロジェクトを使って以下ことをする

  • Bitbucketを使ってXcodeのプロジェクトをリモートリポジトリで管理する
  • リモートリポジトリからcloneして、シミュレータで起動を確認する
  • Carthageを利用したライブラリがチーム開発できるようにうまく利用できていること

動作環境

Bitbacketにプライベートリポジトリを作る

この辺は簡易に書いていくと

※ git:// のプロトコルだとBitbacketにsshのパブリックキーを登録しておく必要があるっぽい

既存のXcodeにリモートリポジトリを紐づける

Xcodeを起動し、先日作ったプロジェクトを選択する。 メニューバーSource Controlを選択、「プロジェクト名 master」を選択、そして「Configure プロジェクト名」を選択するとダイアログが表示される

「Remotes」のタブを選択し、プラスボタンを押すとメニューが出るので、「Add Remote」を選択する

Name:Origin(デフォルトのまま)
Adress: https://account_name@bitbucket.org/xxxx/xxxxx.git(メモしておいたBitbacketのgitのアドレス)

「Add Remote」ボタンを押して、「Done」ボタンを押して設定完了

メニューバーSource Controlを選択肢、Pushを選択、 Push先をoriginにするとBitbacketのパスワードが求められるので入力するとBitbacketにPushされる(アカウント名は非活性で固定されている)

Bitbacketの対象のリポジトリのページへ、ソースのメニューを開き、ソースコードが追加されているのを確認する

リモートリポジトリからクローンする

コンソールから適当なディレクトリに移動し、リモートリポジトリをクローンする

git clone https://account_name@bitbucket.org/xxxx/xxxxx.git
Password for 'https://account_name@bitbucket.org': Bitbacketパスワードを入力する

Xcodeプロジェクトを開いて確認する

クローンしたディレクトリをFinderで開いて、xcodeのプロジェクトファイルを開いてみる コンパイルするとCarthageで指定したライブラリファイルが無いとエラーが出るのがわかる。

Carthageのライブラリを取得する

> carthage bootstrap --platform iOS

carthage update だと最新版のライブラリのバージョンを取得しCarthage.resolvedを参照しない ライブラリを追加しない時はcarthage bootstrap を実行するべきだ

Carthageディレクトリが作成され、ライブラリが作成されたことを確認できる

再びXcodeを起動しコンパイルするとエラーが解消されいるのがわかる

XcodeにCarthageを入れてOSSライブラリを利用する

はじめに

いつのまにやらiOSのライブラリ管理ツールはCocoapodsよりもCarthageになってきているらしい cocoapodsでは必須だった謎のxcworkspaceは不要になり、全然良くわかってないがビルドの速度が上がるようだ

https://github.com/Carthage/Carthage

Carthageの読み方は町の名前のカルタゴではなく英語読みのカーセッジが一般的らしい

Carthageの良さについての日本語はCarthageのReadMeを訳した下記の記事が詳しい http://qiita.com/nori0620/items/b81ae171f0e82b0c2d8a

ゴール

  • Carthageを利用できるようMac及びXcodeの設定
  • サンプルプロジェクトにCarthageを適用し、httpクライアントの定番OSS Alamofireを入れて動作確認する
  • チーム開発が可能な形でGitで管理できる設定をする

  • Carthageの細かいバージョン指定や、ローカルや非公開のライブラリを取得するような細かい使い方は今回は調べない

動作環境

  • xcode 7.3.1
  • osx 10.11.4
  • Homebrew 0.9.9

Carthageをhomebrewからインストール

# インストール
> brew install carthage

# インストールの確認でバージョン番号を調べる
>carthage version
0.16.2

carthageをすでにインストールしてアップデートしたい場合もbrewのupgradeコマンドを素直に実行するだけで良い

> brew upgrade carthage

サンプルのXcodeプロジェクトを新規作成する

適当にSimpleViewApplicationのプロジェクトを作成する

git管理にする

プロジェクト作成時に、プロジェクト名を決めて設置する場所をしてするダイアログで 「Source Control」のチェックが入っていて、セレクトボクスMy Macになっていればローカル保存のGit管理にされていることになる

gitignoreファイルを作成する

xcodeのGit管理がだけが入っている状態ではxcode上では変更・削除されたファイルはxcodeのプロジェクトで管理されたものだけが表示されるが、 コンソールからxcodeのディレクトリに行き git statusで確認するとunstageなファイルとしてテンポラリーで利用するファイルがやらある

xcodeからはCartFileとかはコミットできないのかこの辺はよくわかってない

Githubが公開してくれているgitignoreファイルのテンプレートをつかう https://github.com/github/gitignore/blob/master/Swift.gitignore 上記テンプレートを見るとどうやらCarthegeで作られる余分なファイルにも対応してくれている

xcodeプロジェクト直下で以下のコマンドでgithubのテンプレートから.gitignoreファイルを作成する

> curl    https://raw.githubusercontent.com/github/gitignore/master/Swift.gitignore > .gitignore

.gitignoreファイルから下記項目のコメントを外す

# Carthage/Checkouts
Carthage/Checkouts

こうすることで、CarthageでDLしたライブラリのリポジトリをクローンしたソースコードが入っているだけなので、git管理を無視する対象にする。対象のライブラリのURLが無くなったり変わったりしないかぎり、ここを許容する必要が無いため

Carthageを使ってライブラリをインストールする

Cartfileファイルを作成

xcodeプロジェクトの直下にCartfileファイルを作成する

> touch Carthage

これを"Emacs"で編集する(vimで編集しようとするとmacが爆散します)

Cartfileファイルに内に以下のように追記して保存する 今回使うAlamofireをgithubからDLして利用できるようにする記述をしている

github "Alamofire/Alamofire"

AlamofireをCarthageを利用してビルド

ビルドには時間がかかるので、ビルド対象を選ばないと様々なプラットフォーム向けにビルドしてしまうので必要な物だけ利用する

# --platformオプションを付けてiOSを指定してビルドする
> carthage update --platform iOS
 carthage update
*** Fetching Alamofire
*** Checking out Alamofire at "3.4.0"
*** xcodebuild output can be found in /var/folders/lg/h7kjqrs51qs417r4ysy2z_3r0000gn/T/carthage-xcodebuild.COQug2.log
*** Building scheme "Alamofire iOS" in Alamofire.xcworkspace

/Carthage/Build/iOS/Alamofire.framework のコンパイルされたframeworkファイルが有るのが確認できる

XcodeのプロジェクトでAlamofireを利用する

Linked Frameworks and Librariesにライブラリを追加する

Xcodeでプロジェクトファイルを選択し、 Generalメニューを開く Linked Frameworks and Libraries の項目にあるリストに、 Finderで/Carthage/Build/iOS/Alamofire.framework を選択しドラックアンドドロップで追加する

またプラスボタンでダイアログを使って追加することも出来る。

Run Scriptの追加

Xcodeでプロジェクトファイルを選択し、 Build Phraseメニューを開く

プラスボタンを押し、「New Run Script Phrase」を選択する 選択すると「Run Script」と言う項目が追加されるので、そこをクリックして詳細設定を開く

ここでまず「Shell」の下にある黒い部分に以下を追記する

/usr/local/bin/carthage copy-frameworks

つぎにinput fileにあるプラスボタンを押し以下の様に、Alamofire.frameworkのパスを追加してやる。

$(SRCROOT)以降はどこでAlamofire.frameworkをコンパイルしてもこのパスで書かなければならないっぽい、ここもよくわかってない

$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework

 Alamofireを利用してみる

ViewController.swiftファイルのviewDidLoadメソッド内に、 Alamofireを利用してTwitterのトップページを取得してコンソールに出力するコードを追加する これでシミュレータを起動してコンソールにHTMLが吐き出される

import UIKit

# 追記
import Alamofire

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
         # ここから追加 
        Alamofire.request(.GET, "https://twitter.com/")
            .responseString { response in
                print(response.result.value)
        }
        # 追加終わり
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}

refs: * https://github.com/Carthage/Carthage * http://blog.dalt.me/1199 * http://blog.morizotter.com/2015/07/19/how-to-carthage-distribution/

買っておいて損はない

詳解 Swift 改訂版

詳解 Swift 改訂版