如何使用swift执行SelectorOnMainThread并获取返回值而不使用闭包?

时间:2016-05-29 04:45:29

标签: ios swift cocoa cocoa-touch

我试图运行的功能是:

func dateFromSection(section: Int) -> (startDate: NSDate, endDate: NSDate)?

如何使用以下命令运行它并在不使用调度函数的情况下捕获返回值?

performSelectorOnMainThread(aSelector: Selector, withObject: AnyObject?, waitUntilDone: Bool)

3 个答案:

答案 0 :(得分:0)

如果你是绝对的,确定你已经在主线程上,你可以这样做:

var dates: (startDate: NSDate, endDate: NSDate)?
dispatch_sync(dispatch_get_main_queue()) {
    dates = someObject.dateFromSection(section)
}

答案 1 :(得分:0)

您为什么使用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)
      })
   }
}

答案 2 :(得分:0)

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

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