我使用的是 macOSX (Sierra),而不是 iOS、Objective-C、Xcode9。
我有一个带有已实现的 applescript 类的应用程序,XCode 为我编译它们。每当我从 *.m 文件(以及后台线程!)中调用 applescript 方法时,我将它 dispatch_sync 到主线程(因为 applescript 需要在主线程中执行) - 同步原因我需要结果才能继续。
我想用一个简单的例子告诉你:
Applescript:
2 3 4 5 6 7 8 9 | 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
2 3 4 5 6 7 | // 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 编译时,无法在 applescript 中使用"超时 x 秒"(就像其他帖子中提到的那样不起作用)。
我用 NSOperations 尝试过,但因为我需要分派到 mainThread ......仍然是同样的问题。
所以我的问题是:有什么方法可以在 x 秒后停止整个 dispatch_sync 块?或者是否有任何其他方法可以通过 InDesign 冻结来保持应用程序运行并且不会永远被锁定?
注意:实现工作正常 - 请不要推荐\\'use NSApplescript\\' 或\\'use Scripting Bridge\\'。
原因:ScriptingBridge - 几乎不可能为 InDesign 创建一个有效的 HEADER 文件(它几乎有 15 MB 的大小并引发大量编译器错误 - 我确实通过大量手动工作修复了这个问题,只是为了看到它不再适用于InDesign 的下一个版本)。只要你有简单的脚本,NSApplescript 就可以了。
任何帮助表示赞赏
如果 NSAppleScript 足以满足您的需求,我会说使用 NSUserAppleScriptTask,它使用异步完成回调在进程外运行脚本。是的,正如您所说,Scripting Bridge 完全不适合重要的自动化,尤其是任何涉及 Adob??e 等大型复杂硬壳 Carbon 应用程序的应用程序,所以不要在这上面浪费一秒钟。
有 AppleEventBridge/SwiftAE,但随着 Apple 洗牌整个 AS/AE 基础设施以悄然消亡,我不再推广或支持它们,所以 maxima 告诫购买者。 (我仍然使用 Python appscript 来实现我自己的 Adob??e 应用程序自动化,顺便说一句,它继续把其他一切都吹得一团糟,但如果整个行业最终将 Windows 作为唯一的面向专业的平台留下来,我不会感到惊讶。 )
..
使用 AppleScript-ObjC* 的问题在于 AppleScript 组件(也称为解释器)实例不是线程安全的:您可以在您喜欢的任何线程上实例化它们,但您只能在该线程上使用它们,而不能在其他线程上使用它们。 ASOC 不允许您自己控制任何这些东西; NSAppleScript 也没有。 (OSAKit 可以,但使用起来和 NSAppleScript 一样痛苦。)因此 ASOC 代码实际上仅限于在主线程上运行。
如果您坚持使用 ASOC,我认为您最好的办法是将该代码推送到您的主进程通过 XPC 服务或其他方式异步与之对话的子进程中。这将避免阻塞主进程的主事件循环(然后阻塞它的 GUI),同时允许 ASOC 独立地做自己的事情。
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p
我是ruby的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp