2016-05-29 11 views
0

私が実行しようとしています機能はこれです:はどのように迅速にperformSelectorOnMainThreadとクロージャを使用せずに、戻り値を取得しますか?

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

は、どのように私は次のように使用して、それを実行し、ディスパッチ機能を使用せずに、戻り値をキャプチャしていますか?

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

答えて

0

あなたは、絶対にあなたがメインスレッドですでにないだ積極確実である場合は、この操作を行うことができます。

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

おかげで、私は疑問に対応するための –

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) 
     }) 
    } 
} 
+0

感謝を更新している、私は質問 –

+0

を更新したあなたはより多くの私たちを与えるであろう、 'scrollToDate'と' dateFromSection'の内容を追加してもらえ私たちが探しているものを明確にします。 –

0

それからリターンをキャプチャすることはできませんので、あなたは、このケースではperformSelectorOnMainThread:withObject:waitUntilDone:を使用しないでください。代わりにdispatch_asyncを使用してください:対応するための

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

応答ありがとう、私は質問を更新しました –