проблема параллелизма 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 3

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 из блока завершения внутри блока завершения, либо вызвать метод/делегат, который будет обрабатывать результат блока завершения.