私はMacOSX(Sierra)で、iOS、Objective-C、Xcode9ではありません。Objective-Cとapplescript - >タイムアウトイベントとスレッド
私は実装されたAppleScriptクラスを持つアプリケーションを持っていますが、XCodeはそれらを私のためにコンパイルします。私が* .mファイル(とバックグラウンドスレッドから)からapplescriptメソッドを呼び出すときは、私はdispatch_syncをメインスレッドに渡します(applescriptはメインスレッドで実行する必要があります)。
私は簡単な例をお見せしたいと思います:
AppleScriptを:
on openFile_filePath(filePath)
try
tell application "Adobe InDesign CC 2018"
set myDoc to open (filePath as string)
return id of myDoc
end tell
end
return 0
end
のObjective-C
// Method is running in a background thread
// appleScriptHelper is properly instantinated
__block NSInteger docID = 0;
NSString* someFile = @"/Users/user/Desktop/";
dispatch_sync(dispatch_get_main_queue(), ^{
docID = [self.appleScriptHelper openFile:someFile];
});
これがスムーズに実行 - 限りのInDesignが応答するよう!時には、InDesignがフリーズし、私のアプリ全体がフリーズして、基本的にメインスレッドで永遠に待っていることがあります。
私は何を試したのですか: メインスレッドがブロックされていて、 "キャンセル"メッセージが表示されないため、私はタイマーを使用できません--Applescriptは何とか起こらないことを待っています。 さらに、Xcodeからコンパイルされたときに、 "timeout of x seconds"を使うことはできません(他の記事で述べたように動作しません)。 NSOperationsで試しましたが、mainThreadにディスパッチする必要があります...同じ問題です。
私の質問は次のとおりです。x秒後にdispatch_syncブロック全体を停止できる方法はありますか?または、アプリケーションを実行し続け、InDesignのフリーズによって永遠にロックされないようにする他の可能性はありますか?
注:実装はうまくいきます。「NSApplescriptを使用する」または「スクリプトブリッジを使用する」をおすすめしません。 理由:ScriptingBridge - InDesign用の作業用のHEADERファイルを作成することはほとんど不可能です(ほとんど15 MBの重量となり、コンパイルエラーが発生します)。次回のバージョンInDesignの)あなたがそうでない単純なスクリプトを持っている限り、NSApplescriptは問題ありません。
すべてのヘルプは
はあなたの詳細な回答をいただき、ありがとうございます。詳細に調べることなく、XPCサービスは私に最も有望です。私はリンゴのドキュメントを読んで、さらに掘り下げます。 Chefdeveloper ASの終了とその本当に種類がわからないASに何が起こりますか。しかし、限りOS上でより良い代替手段は、私はそれにとどまらなければなりません。 –