有一段代码使用 CFHostStartInfoResolution() 进行 DNS 查找。然而,这是同步的,因此在它返回之前会阻塞任何东西——这很糟糕,我也认为它会在连接较弱时由于超时而导致崩溃(当它不好时它会直接安全地失败)
所以我想异步执行此操作,就像文档中应该做的那样 https://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFHostRef/Reference/reference.html 新文档 URL 20190227:https://developer.apple.com/documentation/cfnetwork/cfhostref
具体说:
If you want to resolve the host asynchronously. call CFHostSetClient to associate your client context and user-defined callback function with the host. Then call CFHostScheduleWithRunLoop to schedule the host on a run loop.
然而,这让我望而却步,因为我已经很久没有编写 C 代码了,无法正确获得回调和运行循环/线程。
我应该如何调用 CFHostSetClient、CFHostScheduleWithRunLoop,以及如何实现这些回调?我需要开始一个新线程吗?
最佳答案
实际上 CFHost 自 macOS 10.7 以来就有一个错误。在 10.7 之前,可以取消在第二个线程上调用 CFHostCancelInfoResolution() 的同步查找,但是从 10.7 开始,这就不再可能了(它只是不会取消查找)。我在 2013 年向 Apple 报告了该问题(错误编号为 13672880),但尽管确认了这一点,Apple 至今仍未修复它。
然而更有趣的部分是 Apple 在他们的回复中建议:
The best API for host name resolution is DNSServiceGetAddrInfo and that's asynchronous and cancelable.
据记载,该 API 在 macOS 10.11.4、iOS 9.3、tvOS 9.2 和 watchOS 2.2 上存在 - 但我认为这不正确,它一定存在,否则 Apple 怎么会推荐它2013 年(10.11 于 2015 年发布)。我可以确认这个 API 也存在于 iOS 8 和 macOS 10.9 上,甚至可能更早地存在于这两个系统上。
此 API 在内部使用同步 C 调用 getaddrinfo() 的未记录的异步版本,该版本可在当今所有类似 POSIX 的系统上找到。
与其他 API 相比的一个优势是,您可以选择是否只想检索 IPv4、IPv6 或这两种地址,或者您可以让系统根据系统考虑的地址决定为您选择地址系列目前可以访问(这是大多数其他解析 API 的默认设置)。
此外,如果系统具有多个事件网络接口(interface)(例如电缆 + WiFi 或 WiFi + 移动设备),您可以选择要使用的接口(interface),因为不同的接口(interface)上可能设置了不同的 DNS 设置(不同的 DNS 服务器可以提供不同的结果)对于相同的域名)。如果您不选择一个,系统将始终使用当前的默认服务器(这是大多数其他解析 API 的默认值)。
关于ios - 异步 DNS 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18529436/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde