iOSアプリの共通機能をライブラリを使って逃がす
はじめに
同じ機能があるアプリを2〜3も作ってると結構メンテナンスが辛い。共通機能を小まめにライブラリ化して、ライブラリを更新するだけで両方が更新される状況を作りたい。
ただ、両方のコードを全て共通化させて楽をするというのは上手く行かなさそうなので、あくまで小さいパーツに切り分けて、操作は各アプリで違ってくるという考え方良いと思っています。
CocoaPodsによる、外部ライブラリの利用と作成 | Developers.IO を読んでライブラリを作ってみます。
結構簡単にできました。今回は複数のアプリで使っていたTableViewControllerをライブラリに逃がしてみました。
try! Swift 文化を調和させる で学んだDataSourceの外出しを試してみました。ちょうど、最後の方のスライドの上に外出しした部分をライブラリにした具合ですね。
ライブラリを更新して、複数のアプリでpod updateすれば修正が全てに適応されます。ライブラリコードを固めることで良くも悪くも、自由度が下がり保守コストが下がります。
何はともあれCocoapodsの設定ファイルを作る
ライブラリは作成済み前提です。以下の様なコマンドを実行します。
$ pod spec create XXX
作成されたXXX.podspecを適切に編集する。
プライベートなCocoaPodsのSpecsを作成してデプロイ
githubで空っぽのCocoaPodsSpecsを作成してから作業する。
$ pod repo add yoneapp https://github.com/yoneapp/CocoaPodsSpecs $ pod repo push yoneapp --allow-warnings --verbose
Podfileを書き換える
source 'git@github.com:yoneapp/CocoaPodsSpecs.git' source 'https://github.com/CocoaPods/Specs.git' use_frameworks! platform :ios, '8.0' target 'YYY' do pod 'XXX' end
自分のライブラリ内で外部ライブラリを使う
Pod::Spec.new do |s| ... s.dependency 'PullToRefreshSwift', "= 2.0.0" end
ios - How to import Alamofire/AFNetworking in my custom cocoapod - Stack Overflow
まとめ
今回作ったライブラリは公開できなさそうなんだけど、自前コードをライブラリ化する癖をつけておけば Motivation based library abstraction のようにライブラリを公開出来る日が来るんじゃないかなと思いました。
try! Swiftで学んだこと
私のスキル的に、1発表に対して実際に取り込めるのは1〜2個が限界なので、学んだことが少ないのは申し訳ない。
一番学んだことは、海外からの出席者が居るカンファレンスなんだから英語出来たほうが良かったねということ。HiNative Trekの今月のテーマが「カンファレンスでの会話」らしいので受講を開始しました。
続きを読むRealm + 高さが可変するTableViewの考察
何度か、Realm + 高さが可変するTableViewにチャレンジしてみて、自分の中で最終的にこんな感じかなと思ったのでサンプルを作成してみました。アドバイス頂けると嬉しいです。
GitHub - yoneapp/RealmTableViewSample
高さを計算する処理が重く、バックグラウンドに逃したいがRealmはスレッドをまたげないのでバックグラウンド処理において、どう書けばいいのかについて悩み続けています。
ここに至った経緯を記します。現在、四個目です。
一個目
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat にて text.boundingRectWithSize を使用して高さを計算する。もちろん text.boundingRectWithSize をMainThreadで実行すると重い。
二個目
バックグラウンドで text.boundingRectWithSize を実行する。もちろん、Realmを使っているので落ちる。また、上手くごまかせたとしてもデータが書き換わった時に対処しにくい。
三個目
全てのデータをRealmから取り出し、普通のオブジェクトにしてしまう。この場合、Realmの遅延評価による高速性を犠牲にする。また、データが何千件もある場合に処理に時間が掛かる。更新にも時間がかかる。
四個目
仮想のCellを作成して、そこで高さ計算を行う。Realmオブジェクトに識別子を付け、仮想のCellと結びつける。仮想のCellの計算が終わってない場合は、仮のセルを表示しておく。
仮想のCellは、現在表示されてるCellのプラスマイナス5個ぐらいを常にバックグラウンドで計算するようにする。
実際にRealmのデータが削除された場合でも、データがない場合は仮のセルが表示されるのでクラッシュせずに動作します。
五個目
RealmのSlackで質問させて頂いた所、複雑なことをしなくても UITableViewAutomaticDimension で解決できるとアドバイス頂きました。実際の所、高さ計算はそんなに重くないようでした。estimateHightを合わせて使えば、計算されるセルの数も限定できるので簡単に実装することができそうです。
WebからiOSアプリを開く技術調査
URLSchemeでアプリの有無によって挙動を変える(iOS9対応版) | astone.jeez.jp によると、現在はURLに応じて上手く切り替えるのは、うまく動かない可能性が高いようだ。
SmartNews(SmartBanner)
最もスマートな純正ソリューションだが、WebViewで表示されないのが痛い
続きを読むWIP@Annotationが使えるJavaScriptグラフライブラリの選定
TODO: Googleで[Annotation JavaScript graph]で検索する
JavaScriptグラフ適当分類メモ
JavaScript Graphing Library Comparison
グラフ比較サイトだけど多くて選別できない
多機能
Data Visualization - Gallery of Interactive JS Charts | ZingChart
jQuery Widgets & Controls - ASP.NET MVC Controls – IgniteUI
vis.js - A dynamic, browser based visualization library.
リアルタイムグラフやタイムラインが面白い
plotly.js | JavaScript Graphing Library
JavaScript Charts and Maps | amCharts
http://js.devexpress.com/WebDevelopment/Charts/
アニメーション
Chartist - Simple responsive charts
おしゃれアニメーション
真面目おしゃれ
おしゃれ
Canvasで超可愛いグラフが作れる!「Chart.js」の紹介 | 株式会社LIG
まじめ
Beautiful HTML5 JavaScript Charts | CanvasJS
Highmaps JavaScript Maps | Highcharts
GitHub - codesuki/react-d3-components: D3 Components for React
dimple - A simple charting API for d3 data visualisations
Multiple plots sketch - jagracar
シンプル
Chart Gallery | Charts | Google Developers
3D座標
GitHub - frewsxcv/graphosaurus: 3D graph viewer powered by WebGL (three.js)
サムネイル
組織図
yFiles for HTML - HTML5 / JavaScript Diagramming Library
ネットワーク
Cytoscape: An Open Source Platform for Complex Network Analysis and Visualization
GitHub - anvaka/VivaGraphJS: Graph drawing library for JavaScript
ヒートマップ
heatmap.js : Dynamic Heatmaps for the Web
地図
おまけ
WIP@CSSをどう書くか考えるために各社のCSSを調べてみた
Cookpad
内製 Sara Framework
normalize.css v3.0.0
suit-utils-link v0.2.0
後はベタ書きかな
OneSignal
Bootstrap