問題タブ [nsfilecoordinator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
170 参照

objective-c - NSFileVersion: ファイルをコピーして競合を解決する

Documents フォルダー全体に NSFilePresenter があります。以前はファイルを iCloud コンテナに入れていましたが、ファイルが複数のデバイスで同時に作成された場合、iCloud によって自動的に名前が変更されました。同時に、presentedSubitemAtURL:(didMoveToURL:特定のデバイスで作成された特定のファイルの名前が変更されたことを通知します。ファイルが iCloud によって自動的に移動されていることを知る唯一の方法であるため、これは重要です。

- (void)presentedSubitemAtURL:(NSURL *)url didGainVersion:(NSFileVersion *)versionただし、 iCloud でファイルの名前を変更するだけではなく、インプレースで書き込みたい場合もあるため、競合を自分で解決して実装するようになりました。

iCloud と同じ方法で、同じファイルの競合するバージョンを 2 つのファイルに分ける適切な方法は何ですか? したがって、両方のデバイスがfile.txt同時に書き込みを行った場合、ファイルの 1 つを に移動する必要がありますfile 2.txt

これまでのところ、ファイルの最新バージョンを取得する解決策があります。

0 投票する
1 に答える
198 参照

cocoa - メインスレッドをブロックせずに NSApplication/NSWindow のすべてのユーザー操作を無効にする方法は?

ユーザーにフォルダー構造を提示し、移動/コピー/名前変更などの基本的なファイル システム操作を可能にする Cocoa アプリを使用しています。

アプリのスクリーンショット

私はすべてのファイル システム アクセスをバックグラウンド キューで実行し、 経由でファイル調整を使用しますNSFileCoordinator

ユーザーがファイル「Notes.txt」をフォルダ「Project B」にドラッグしたとします。これが私がすることです:

  1. バックグラウンド キューでファイルを移動するファイル操作をスケジュールします。
  2. それが完了すると、アウトライン ビューを更新するメイン キューのブロックが呼び出されます。

ファイルを移動するバックグラウンド操作に時間がかかるとします。最初の操作が完了するまで、ユーザーがファイルを移動したり、他のアクションを実行したりしないようにする必要があります。

したがって、私はしたいと思います:

  • ウィンドウとのすべてのユーザー操作を無効にする
  • ほとんどのメニュー項目とキーボード ショートカットを無効にする
  • [Quit Cmd-Q] などの特定のメニューを機能させ続ける
  • メインスレッドをブロックしない

頭に浮かぶ 1 つの解決策:モーダル シートを使用しますか? .

ほとんどの場合、操作はすぐに終了し、シートはほんの一瞬しか表示されず、気が散ってしまうため、私はこれを行いたくありません。

500ミリ秒以上かかる場合、操作が「対話ブロックモード」から「モーダルシート」に切り替わるのにかかる時間を追跡します。

問題は、実際にモーダル シートを表示せずに、このような「ユーザー インタラクション ブロック モード」を実装するにはどうすればよいかということです。

別のアイデア:すべてのコントロールを無効にする

すべてのコントロールを設定することを検討しisEnabled = falseましたが、UI が任意に複雑になる可能性があり、メニューまたはキーボード ショートカットによるアクションを妨げないため、それはオプションではありません。