Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS Concurrency issue: method returned before got the pedometer data

like the code below, when I want to return a pedometer data through a method for some connivence, but the method returned earlier than the data be retrieved.I think this maybe a concurrency issue. How could I return the data in a right way for future use?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
}
like image 739
DevQiao Avatar asked Dec 05 '25 07:12

DevQiao


1 Answers

You're right about it being a concurrency issue. You should use the result inside the handler of the queryPedometerDataFromDate. One way of achieving this would be to use a completion block for your queryPedometerTodayTotalData method instead of having it return a value, like this:

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)
    }
}
like image 164
marosoaie Avatar answered Dec 06 '25 22:12

marosoaie



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!