2016-05-06 1 views
3

, как и код ниже, когда я хочу вернуть данные шагомера с помощью метода для некоторой попустительности, но метод, возвращенный ранее, чем данные будут восстановлены. Я думаю, это может быть проблема параллелизма. Как я могу правильно вернуть данные для использования в будущем? ThxПроблема параллелизма iOS: возвращаемый метод до получения данных шагомера

func queryPedometerTodayTotalData() -> Int { 
    var pedometerDataOfToday: CMPedometerData? 
     self.queryPedometerDataFromDate(NSDate.today()!, toDate: NSDate(), withHandler: { (pedometerData, error) in 
      pedometerDataOfToday = pedometerData! 
      print("this print after got data in a background thread:\(pedometerDataOfToday)") 
     }) 
     print("This should print before last print, and there haven't got the data now: \(pedometerDataOfToday)") 
    return pedometerDataOfToday 
} 

ответ

2

Вы правы, что это проблема параллелизма. Вы должны использовать результат внутри обработчика queryPedometerDataFromDate. Одним из способов достижения этой цели будут использовать блок завершения для вашего метода queryPedometerTodayTotalData вместо того, чтобы он возвращает значение, например:

func queryPedometerTodayTotalData(completion:((CMPedometerData?)->())) { 
    var pedometerDataOfToday: CMPedometerData? 
    self.queryPedometerDataFromDate(NSDate.today()!, toDate: NSDate(), withHandler: { (pedometerData, error) in 
     pedometerDataOfToday = pedometerData! 
     completion(pedometerData) 
    }) 
} 

func testQueryPedometerTodayTotalData() { 
    self.queryPedometerTodayTotalData { (data) in 
     print(data) 
    } 
} 
+0

thx.I сделал так, он мог правильно напечатать данные, но как бы я вернуть данные? 'func testQueryPedometerTodayTotalData() -> CMPedometerData { var todayData: CMPedometerData? self.queryPedometerTodayTotalData {(data) in todayData = данные } возвращение сегодняДата! } '
Это снова будет сбой –

+0

Вы не можете вернуть его, так как он асинхронный. Вы используете его в блоке завершения. Вместо того, чтобы печатать данные, вы можете делать с ними все, что вам нужно. – marosoaie

+0

Так что цените. Я использую другое решение для его решения. Но я действительно хочу знать, почему я не смог получить или вернуть асинхронный результат? Я использовал переменную экземпляра, чтобы сохранить результат в блоке и вернуться, не могли бы вы объяснить, почему это не работает, thx again –

0

Это проблема параллелизма. queryPedometerDataFromDate - асинхронный метод. он выполняет блок завершения всякий раз, когда iOS считает это (как правило, после получения данных), поэтому вторая печатная строка печатает сначала и не возвращает результат.

Вам необходимо либо использовать pedometerData из блока завершения внутри блока завершения, либо вызвать метод/делегат, который будет обрабатывать результат блока завершения.