coteditor/CotEditor — pull request #38 by 1024jp (2014-03-07 19:18:42+00:00)
Title: Fix/issue29 external update alert

issue #29 の修正コミットです。

おそらく修正できたのでいったんマージして頂けると幸いです。

前回以来の修正点を一応ちょっと解説します。複雑...。

- DVKQueue の使用を辞め、NSFilePresenter の `presentedItemDidChange ` をファイル更新感知に使用
- それにともないドキュメンントから DVKQueueに関する記述を削除
- `presentedItemDidChange ` は DVKQueue (or UKKQueue) と違いファイル更新から若干のディレイがあるので、その間に基本的にはファイル書き込み作業が終わっている
- ↑にともない、セーブ時にフラグを立ててフラグ立っている間は更新を無視する機構を削除
- Revert時にfileModificationDateがアップデートされていなかったのを修正
- これによって、 Update を選択したにも関わらず保存時にもう1度アラートが出ることを抑制
- またUpdate後セーブ前のファイル変化で必ずアラートが出る問題も解決
- ファイル更新が有効なものかを確認するためにファイルオープン時および書き込み時に発行したMD5ハッシュを比較する方法を追加
- ファイル保存の10秒程度後に「別のプロセス〜」アラートが出ることがあるのでそれの抑制
- ハッシュ比較はファイルの中身が変更されているかの確認としては手堅い方法だと考えられるので、何かと妥当かと判断
- ただ、 `presentedItemDidChange ` が飛んでくるたびにファイル全体を読み込むのはどうかと思ったのでいったんは `fileModificationDate` で確認をしてそれで漏れたものだけをハッシュ比較するようにしている
- MD5を得るコードにはNSDataにカテゴリを追加する [iOS Developer Tips](http://iosdevelopertips.com/core-services/create-md5-hash-from-nsstring-nsdata-or-file.html) のものを使用した
- セーブプロセス終了時にfileModificationDateをもう1度保存し直すように修正
- 実際にはセーブ時にはfileModificationDateは更新されているので本来は不要なのだが、時折 **セーブ時** に「別のアプリケーションによって〜」というアラート（CotEditorが自ら出しているアラートとは別）が表示されることがあることへの対策

これで、アラート問題は解決した...と思います。また出たらリオープンして下さい1。

--
1. 検証中は出なかったんですが、「別のアプリケーション〜」がまだ出るようなら fileModificationDate の更新に若干のディレイをかけてみようかとは考えています。このアラートに関しては self.fileModificationDate が絡んでいることは確実です。