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)
}
}
像下面的代码,当我想通过某种方便的方法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)
}
}