Carthageを使ってRealmを導入しよう

環境

導入

pkgファイルをダウンロードする

すでに完了している人は飛ばしていただいて大丈夫です。
下記のサイトからCarthage.pkgをダウンロードし、実行する。
Releases · Carthage/Carthage · GitHub

ライブラリの導入

  1. ディレクトリの移動

ライブラリを導入したプロジェクトのディレクトリに移動します。

cd projects/application/testProject
  1. Cartfileの作成
touch Cartfile
  1. Cartfileにライブラリを記述
github "realm/realm-cocoa" ~> 2.6.2
  1. 外部ライブラリのビルド

少し時間がかかります。
今回はiOSだけビルドするように指定しています。

carthage update --platform iOS
  1. プロジェクトにライブラリを追加

Generalタブを選択し、
「Linked Frameworks and Library」にある+ボタンを押します。
f:id:MTIMSNO:20170423144535p:plain

フレームワークを選択する画面になるので、「Add Other...」を選択し
プロジェクトのディレクトリ内から、Carthage/Build/iOSと移動し、「Realm.framework」/ 「RealmSwift.framework」ライブラリを選択。

次に、Build Phasesタブを選択し、
+ボタンから、「New Run Script Phase」を選択します。

赤色で囲ってある部分に下記の内容を記述。

/usr/local/bin/carthage copy-frameworks

緑色で囲ってある部分フレームワークの内容を記述。

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

f:id:MTIMSNO:20170423145730p:plain

以上でRealmの導入は完了です。

Realmの書き込み / 読み込み

Realmとは

 モバイル向けに作られた軽量なNoSQL Database
 Java / Objective-C / JavaScript / Swift / Xamarin などに対応。
 OSSであり、完全無料で使用できる。

 
realm.io

NoSQLデータベース環境とは、
幅広い種類の膨大な量のデータを高速かつ動的に整理し分析することを可能にする、
非リレーショナルな広域分散データベースシステムです。

NoSQLデータベース ― 定義と解説 | DataStax Academy: Free Cassandra Tutorials and Training

続きを読む

数百万件のデータを簡単に作成する方法

負荷テストを行うために数百万件のデータが必要になることがあります。

1行1行追加していくのは大変ですねよ。

そこで、SELECT文とINSERT文を使用してデータを増やしていきます。

続きを読む

< Android > アプリ内課金について

Sandboxテスト…

予約されている所定のアイテムIDを使ってアプリ内課金処理の実装をテストできます。
このテストでは、実装が正しくGoogle Playからのレスポンスを処理し、署名を検証できることを確認できます。

つい最近までアプリ内課金テストを行うと
"購入が完了しました。"
とダイアログが表示されていた。
もちろんレシートと一緒にorderIDも取得できていました。

しかし、先週の月曜日(6/20)からダイアログには
"「課金アイテム名(アプリ名)」をライブラリに追加しました。"
と表示され、orderIDの取得も出来なくなりました。

おかげで課金のテストがうまくいかなくなり大変困りました。

Googleに問い合わせてみたところ
2016年6月20日(PDT)にアップデートが入ったとのことでした。
内容は以下の通りです。

Sandbox環境を利用したテスト課金にてorderIDは返却されず、

またGoogle Merchant Centerに表示されなくなります。
この変更に伴い、Sandbox環境を利用したテスト課金におきまして
orderIDではなくpurchaseTokenを代用として今後ご利用ください。

また、テスト課金時に表示される文章が
「ライブラリに追加しました」に変更され、
「続行」ボタンが表示される仕様になりましたが文章の変更のみで
挙動としてはこれまで通りです。


詳しく知りたい方は以下のURLより
developer.android.com

< Cocos2d-x > シーン移動について

Cocos2d-x バージョン : v.3.x


Cocos2d-xのシーン移動はとても簡単で以下の通りです。

// Ver3.x.
Director::getInstance()->replaceScene(HelloWorld::createScene());


このシーンの移動時に特殊な演出をいれる時に使用するのが
Transitionクラスというものです。

以下のようなクラスが用意されています。

  • TransitionFade
  • TransitionFlipAngular
  • TransitionShrinkGrow
  • TransitionMoveInB
  • TransitionMoveInT
  • TransitionMoveInL
  • TransitionMoveInR
  • TransitionFadeTR
  • TransitionFadeUp
  • TransitionFlipX
  • TransitionFlipY
  • TransitionPageTurn
  • TransitionCrossFade


書き方としては以下のような形になります

// TransitionFadeの場合

// 引数1 --- フェードの時間
// 引数2 --- 移動シーン
// 引数3 --- フェードの色
Director::getInstance()->replaceScene(TransitionFade::create(1.0f, HelloWorld::createScene(), Color3B::WHITE));

ほかの使い方については調べるといっぱい出てきますので省略。


今回お話ししたいのはシーン移動時の処理の呼ばれるタイミングについてです。
シーン移動をした場合は以下のような処理が呼ばれます。

Scene1::Scene1
Scene1::init
Scene1::onEnter
Scene1::onEnterTransitionDidFinish

Scene2::Scene2
Scene2::init
Scene2::onEnter

Scene1::onExit
Scene2::onEnterTransitionDidFinish
Scene1::~Scene1

onEnter / onExit
--- シーンの切り替え時に必ず呼ばれる関数。

onEnterTransitionDidFinish
--- Transitionアニメーションが終了したタイミングで呼ばれる関数。
   (Transitionしていなくても呼ばれる)


このonEnterTransitionDidFinish関数で
replaceSceneなどを行うとフリーズするという問題が発生します。

対策としてはonEnterTransitionDidFinish関数ではディレイを入れて
最低1フレーム待機することでこの問題を解決することが出来ます。

試しにシーンに名前を付け、
下記のパターンのときのonEnterTransitionDidFinish関数内で
現在動作しているシーンを取得してみた結果以下のようになった。
シーン移動前のシーン名 : Scene1
シーン移動後のシーン名 : Scene2

1.通常のシーン移動(repreceScene)
 取得できたシーン名 : Scene2

2.Transitionを使用
 取得できない

3.Transitionを使用しディレイを入れる
 取得できたシーン名 : Scene2


デストラクタが関係してるのではないかと…思う。