проблема параллелизма iOS: метод возвращен до получения данных шагомера
Как в приведенном ниже коде, когда я хочу вернуть данные шагомера через метод для некоторого попустительства, но метод возвращается раньше, чем данные будут восстановлены.Я думаю, что это, возможно, проблема параллелизма. Как я могу вернуть данные в правильном виде для дальнейшего использования?Thx
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) } }
Это проблема параллелизма.
queryPedometerDataFromDate
является асинхронным методом. он выполняет блок завершения всякий раз, когда iOS сочтет это (что обычно происходит после того, как он получил данные), поэтому 2-я строка печати печатает первой и не возвращает ваш результат.Вам нужно либо использовать
pedometerData
из блока завершения внутри блока завершения, либо вызвать метод/делегат, который будет обрабатывать результат блока завершения.