Как performSelectorOnMainThread с swift и получить возвращаемое значение без использования замыканий?

Функция, которую я пытаюсь запустить, это:

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

Как запустить его с помощью следующего и записать возвращаемое значение без использования функций диспетчеризации?

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

3 ответа

  1. Если вы абсолютно, положительно уверены, что вы еще не на главной нити, вы можете сделать это:

    var dates: (startDate: NSDate, endDate: NSDate)?
    dispatch_sync(dispatch_get_main_queue()) {
        dates = someObject.dateFromSection(section)
    }
    
  2. Почему вы используете PerformSelectorOnMainThread? Вы могли бы использовать dispatch_get_main_queueвместо этого.

    PerformSelectorOnMainThread вызывает метод receiver на основном потоке, используя режим по умолчанию.

    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)
          })
       }
    }
    
  3. Вы не должны использовать performSelectorOnMainThread:withObject:waitUntilDone:в этом случае, потому что невозможно захватить возврат из него. Используйте dispatch_asyncвместо:

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