RealmデータをwatchOSとiOSとの間でやりとりする(2)


はじめに

(RealmデータをwatchOSとiOSとの間でやりとりする(1)の続きになります。)

watchOSとiOSとの間でRealmのデータをやりとりする実装方法について述べます。
watchOS2+、iOS9+、Swift 3を前提に話を進めます。
動作するコードをサンプルプロジェクトとしてGitHubに公開しました。実機でランすれば、速度感を体験できます。

CocoaPodsでRealmを導入

RealmSwiftを利用したいので、CocoaPods 1.0.0以降では、Podfileを次のように記述します。

target 'SampleRealmOnWatchOS3' do
dynamic frameworks
  use_frameworks!
  pod 'RealmSwift'
end

target 'SampleWatchApp_Extension' do
  use_frameworks!
  platform :watchos, '2.0'
  pod 'RealmSwift'
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.0'
    end
  end
end

サンプルでは、SampleRealmOnWatchOS3がiOSアプリのターゲット名、SampleWatchApp_ExtensionがwatchOSアプリのものとなっています。

ターミナルからpod installを実行して、正常終了すれば準備完了です。

これで、iOS/watchOSの双方でRealmSwiftをimportできるようになりました。

Realmのデータモデルのソースファイルを共有する

iOS/watchOSでRealmのデータをやりとりするために、データモデルのSwiftファイルを共用できるようにする手順を見ていきます。

1. publicでデータモデルを共用できるようにする

まず、データモデルをiOSアプリのターゲット向けに作成します。
サンプルでは、データモデルのクラスFieldについて、Field.swiftをiOSアプリのターゲットSampleRealmOnWatchOS3向けに作成し、次のように定義しています。

Field.swift
import RealmSwift

public class Field: Object {
    public dynamic var text: String?
}

アクセスコントロールpublicにしています。iOSアプリのターゲットSampleRealmOnWatchOS3とwatchOSアプリのターゲットSampleWatchApp_Extensionは別のモジュールなので、この垣根を超えてソースを共用するために指定しています。

2. Compile Sourcesに追加する

1.で作成した.swiftファイルはiOSアプリのターゲットSampleRealmOnWatchOS3に帰属しています。ソース共用のためには、watchOSアプリの(正確にいうと、それが包含するエクステンションの)ターゲットSampleWatchApp_Extensionにもソースを帰属させる必要があります。

TARGETS→SampleWatchApp_Extension→Build Phases→Compile Sources項目の中に、Field.swiftファイルをドラッグドロップして追加します。

これで、iOS/watchOSアプリが同じソースファイルをしてデータモデルを利用できるようになりました。

関連記事

RealmデータをwatchOSとiOSとの間でやりとりする(3)