0

私は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は問題ありません。

すべてのヘルプは

答えて

0

を高く評価し、ニーズには十分NSAppleScriptたが、私は非同期完了コールバックを使用してプロセスのうち、スクリプトを実行し、使用NSUserAppleScriptTaskを言うと思います。また、Scripting Bridgeは、特にAdobeのような大規模で複雑なCarbonアプリケーションを扱うものではないので、それほど目新しいものではありません。

AppleEventBridge/SwiftAEがありますが、Appleが静かに死ぬためにAS/AEインフラストラクチャ全体をシャッフルしているので、私はこれ以上宣伝やサポートをしませんので、最大限注意してください。 (私はまだ自分のAdobeアプリの自動化、btwのためにPython appscriptを使用していますが、それでも他のすべてを吹き飛ばしていますが、業界全体が唯一のプロフェッショナル向けプラットフォームとしてWindowsに移行しても驚くことはありません)

..

のAppleScript-にObjC *を使用しての問題はAppleScriptのコンポーネント(別名通訳)のインスタンスはスレッドセーフではないということです:あなたが好きなスレッド上でそれらをインスタンス化することができますが、あなただけそれらを使用することができますそのスレッド、他人からではありません。 ASOCはあなた自身のためにこれらのものを制御することはできません。どちらもNSAppleScriptはありません。 (OSAKitはそうですが、NSAppleScriptと同じくらい使いづらいです。)したがって、ASOCコードは事実上主スレッド上でのみ実行するように制限されています。

あなたがASOCを使用して立ち往生している場合は、私はあなたの最善の策は、そのXPCサービスまたは何を経由して、あなたのメインプロセス会談への非同期サブプロセスに出てそのコードをプッシュすることだと思います。それは、ASOCは独立して、自身のことを行うために可能にしながら、自分のメインプロセスのメインイベントループ(その後、ブロックそのGUIを)ブロックを避けるだろう。


  • P.S. ASOCのもう一つの問題は、10.13のbridgesupportファイルの変更は、C APIは、既存のASOCベースのスクリプトを破ることができるように、どのようにマッピングされるか/壊れ変更されたことです。 (私はそれが固定されるまで/しない限り、ASOCを推薦停止しました。)
+0

はあなたの詳細な回答をいただき、ありがとうございます。詳細に調べることなく、XPCサービスは私に最も有望です。私はリンゴのドキュメントを読んで、さらに掘り下げます。 Chefdeveloper ASの終了とその本当に種類がわからないASに何が起こりますか。しかし、限りOS上でより良い代替手段は、私はそれにとどまらなければなりません。 –

関連する問題