如何在不使用闭包的情况下快速执行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)
      )
   

【讨论】:

能否请您添加scrollToDatedateFromSection 的内容,这将使我们更清楚地了解我们正在研究的内容。【参考方案3】:

在这种情况下,您不应使用performSelectorOnMainThread:withObject:waitUntilDone:,因为无法从中获取回报。请改用dispatch_async

dispatch_async(dispatch_get_main_queue()) 
    let dates = dateFromSection(section)

【讨论】:

以上是关于如何在不使用闭包的情况下快速执行SelectorOnMainThread 并获取返回值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 jquery 插件的情况下快速跳转到下一部分?

使用C#和Xamarin表单 - 如何在不设置闭包链的情况下关闭一个模态

Git - 如何在不快速转发和合并为当前的情况下恢复以前的提交

如何在不更改字体大小的情况下快速更改 UISegmentedControl 的字体?

如何在不快速在表格视图中添加另一行的情况下编辑行

如何在不知道 NA 值模式的情况下快速将列转换为数字