iOS并发问题:获取计步器数据前返回的方法

iOS Concurrency issue: method returned before got the pedometer data

像下面的代码,当我想通过某种方便的方法return一个计步器数据时,但是方法return比数据更早 retrieved.I 认为这个可能是并发问题。我怎样才能return数据以正确的方式供将来使用?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
}

这是一个并发问题。 queryPedometerDataFromDate 是一个异步方法。只要 iOS 认为它(通常是在它检索到数据之后)它就会执行完成块,所以这就是为什么第 2 行打印第一个而不是 return 你的结果。

您需要使用完成块内的完成块中的 pedometerData,或者调用将处理完成块结果的 method/delegate。

关于并发问题,您是对的。您应该在 queryPedometerDataFromDate 的处理程序中使用结果。 实现此目的的一种方法是为您的 queryPedometerTodayTotalData 方法使用完成块,而不是让它 return 一个值,如下所示:

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