きりかノート 3冊め

おあそびプログラミング

第62回 Cocoa勉強会に行ってきた(10/19)

会場は水道橋の貸し会議室 内海。ここ使うのはひさしぶり。

以下発表など。

「新しい通信クラス群NSURLSessionを使ってみる」iOS

iOS7で導入された新しい通信API。セッションとタスクを分けたことが大きい。

(通常の通信)

  • NSURLConnectionとは異なり、デリゲートなしで処理できる。
  • 通信完了後の処理はblocksで記述する。
  • デリゲート使う場合はNSURLConnectionとデリゲートメソッドが微妙に変わってるので注意。

(認証と証明書)

  • 以前は両方とも同じデリゲートだったが処理が分かれた。
  • 認証は以前のようにcredentialを返り値とするのでなく、用意したcredentialを使ってhandler(blocks)を呼び出す。
  • 証明書でオレオレ証明書を使うには証明書の処理をまるごと実装する必要あり。正規の証明書の処理をCoreFoundationを使って書く。

全体としてすごく使いやすくなっていて、iOS7以降ならNSURLConnectionを使う理由はもうない!

議論など
  • Q.オレオレ証明書って使うの?
  • A.要件としてそういうお仕事がわりとあるらしい。大学など組織で自己CA立ててるケースやExchangeのテストとか。
感想

blocksの呼び出し見てて、「あーすげえ&block.callぽい」とか思った。RubyCocoaもいいかげんblocksの対応必要そうだね。

API前方互換に拡張する」Mac?

古いOSでも新しいAPIを使いたい。自分で同じ機能をカテゴリと実装して

   if (新しいOS) {
     OSの実装;
   } else {
     自分の実装;
   }

としていた。これは不要になったときにコード修正個所が多いし、複数の開発者でやってると同じようなことを別々に実装してしまったりという問題もあった。

今回はObjective-Cの動的メソッド追加を利用して改善する。

  • ランタイム関数class_addMethodなどを使う。
  • メソッドの有無をrespondToSelector:で判定し、なかったら自前実装のメソッドを追加。
  • +initialize で上述の処理を行う。
  • 利用箇所ではそのまま新しいAPIを呼ぶように書く。

とする。

議論など

Q. +のクラスメソッドでもできる?
A. メタクラスに同じようにしてやればよい。
Q. 初期化時にインスタンス生成して、respondToSelector:するのは副作用の心配がある。いくつかのクラスでは「最初に生成されたインスタンス」に重要な意味があるから。
A. クラスメソッドのinstancesRespondToSelector:使うのが良いのでは。

RFC Viewerの紹介」iOS

[告知]来週セミナーやるよ http://atnd.org/events/43950

今までのアプリ開発のパターンをまとめた。MVCで考える。

  • モデル: singletonで管理する。
  • データの保存と読み出しのインターフェイスを統一する。UserDefaultsも同様。
  • 通信では応答の処理にblocksを使うようにした。並列で通信するとき要求と応答の関連を明確にするため。
おまけ QA1176

QA1176 - https://developer.apple.com/library/mac/qa/qa1176/_index.html

  • rvictlコマンドを使うと、MaciOS機器のtcpdumpが取れる。(rvi=remote virtual interface)
  • Macと対象のiOS機器をUSB接続している必要がある。
議論など
  • Singleton使うこと多い
  • [NS|UI]Documentってモデルじゃなくてコントローラだよね。そもそもCocoaMVCって本来のMVCからはずれてない?
  • PACで考えるほうがわかりやすいかも。

「ClangのModules」Xcode

自分の発表。Xcode5から導入された"Modules"の機能について、主にClang側からの視点で話した。

  • コンパイルが速くなる(らしい)
  • module.mapというファイルがあれば使える。
  • ふつうのアプリ開発者は全く気にしなくて良い。勝手にXcodeがめんどう見てくれる。

Cocoaでマルチウィンドウ」Mac

NSDocument/NSDocumentControllerの話ではなくって、アプリ[A]-モデル[M]-ウィンドウ[W]の関連ごとの設計の話。関連の1対1、1対多の組み合わせで次の4種類に分ける。

   No. A:M M:W
   (1) 1:1 1:1 計算機
   (2) 1:N 1:1 辞書やMail.app
   (3) 1:1 1:N PagesやKeynote
   (4) 1:N 1:M PhotoshopやOmniGraffle

Todoアプリを作成しそれぞれのモデルの実装について説明。ウインドウのidentifierの管理など。

タブは1ウインドウに多ドキュメントだけどどうしよう?

議論など
  • 見た目が単純でも複雑なパターンを使って実装することが多い。
  • (1)(2)に相当するアプリでも[NS|UI]Document使う。

「不要になったシミュレータを捨てる方法」Xcode

Xcodeで古いiOSのシミュレータをインストールすることができるけれど

   /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/

にあるファイルを消すだけではダメで、Xcodeの次回起動時に「もう一度ダウンロードする?」とのダイアログが表示されてしまう。

   ~/Library/Caches/com.apple.dt.Xcode/Downloads

の.dmgファイルも削除することで再ダウンロードの確認も行われなくなる。ディスク使用量の削減的にもこっちも削除したほうがよい。

議論など
  • Xcode5でMacによってiOS5のシミュレータが表示されたりされなかったりした。これってCachesの影響なのでは?

その他の話題

次回の予定

12/7(土)に千葉県の松戸で開催します。