如何在不使用闭包的情况下快速执行SelectorOnMainThread 并获取返回值?
Posted
技术标签:
【中文标题】如何在不使用闭包的情况下快速执行SelectorOnMainThread 并获取返回值?【英文标题】:How to performSelectorOnMainThread with swift and get a return value without using closures? 【发布时间】:2016-05-29 04:45:28 【问题描述】:我要运行的函数是这样的:
func dateFromSection(section: Int) -> (startDate: NSDate, endDate: NSDate)?
如何使用以下命令运行它并在不使用调度函数的情况下捕获返回值?
performSelectorOnMainThread(aSelector: Selector, withObject: AnyObject?, waitUntilDone: Bool)
【问题讨论】:
【参考方案1】:如果您绝对确定自己不已经在主线程上,您可以这样做:
var dates: (startDate: NSDate, endDate: NSDate)?
dispatch_sync(dispatch_get_main_queue())
dates = someObject.dateFromSection(section)
【讨论】:
【参考方案2】:您为什么使用PerformSelectorOnMainThread
?你可以改用dispatch_get_main_queue
。
PerformSelectorOnMainThread
使用默认模式在主线程上调用接收方的方法。
dispatch_get_main_queue
返回绑定到主线程的默认队列。
在你的情况下,你应该像这样把你的函数调用放在dispatch_get_main_queue
,这样你就可以取回你的返回值。
dispatch_async(dispatch_get_main_queue(),
let ouptut = self.dateFromSection(YourDate)
// output contains your return value, which is a closure
)
如果您希望回调反映在代码的其他部分中,您可以创建此闭包的本地实例,并可以像这样为其分配返回值。否则,您可以创建一个全局实例并指定可以在其他类中使用的实例。
class YourClass
//MARK: Local Variables
var yourDateClosure : (startDate: NSDate, endDate: NSDate)?
func yourFunctionName()
dispatch_async(dispatch_get_main_queue(),
self. yourDateClosure = self.dateFromSection(YourDate)
)
【讨论】:
能否请您添加scrollToDate
和dateFromSection
的内容,这将使我们更清楚地了解我们正在研究的内容。【参考方案3】:
在这种情况下,您不应使用performSelectorOnMainThread:withObject:waitUntilDone:
,因为无法从中获取回报。请改用dispatch_async
:
dispatch_async(dispatch_get_main_queue())
let dates = dateFromSection(section)
【讨论】:
以上是关于如何在不使用闭包的情况下快速执行SelectorOnMainThread 并获取返回值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 jquery 插件的情况下快速跳转到下一部分?
使用C#和Xamarin表单 - 如何在不设置闭包链的情况下关闭一个模态
Git - 如何在不快速转发和合并为当前的情况下恢复以前的提交