2016-05-06 2 views
3

以下のコードのように、メソッドを使用して歩数計のデータを返すときに、並行性の問題。どのようにして将来の使用のために正しい方法でデータを返すことができますか?ThxiOS並行性の問題:メソッドが歩数計のデータを取得する前に返される

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のハンドラ内で結果を使用する必要があります。それは、正しくデータを印刷することができ、

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

thx.Iはそうしましたが、どのように私がすることができます。これを達成する 一つの方法は、このように、値を返すのではなく、あなたのqueryPedometerTodayTotalDataメソッドの完了ブロックを使用することですデータを返しますか? 'func testQueryPedometerTodayTotalData() - > CMPedometerData { var todayData:CMPedometerData? self.queryPedometerTodayTotalData {(データ)in todayData = data } return todayData! } '
これはもう一度クラッシュするつもりです –

+0

非同期なので返すことはできません。完了ブロックで使用します。データを印刷するのではなく、必要な作業をすべて行うことができます。 – marosoaie

+0

ありがとうございます。私はそれに対処するために別の解決策を使用します。しかし、私はなぜ非同期の結果を得ることができなかったのか知りたいのですか?私はインスタンス変数を使用して結果をブロックに保存して戻しましたが、なぜそれがうまくいかない理由を説明してください。 –

0

これは並行性の問題です。 queryPedometerDataFromDateは非同期メソッドです。 iOSが(通常はデータを取得した後になると思われる)場合はいつでも、完了ブロックを実行します。そのため、2番目の印刷行が最初に印刷され、結果を返さないのはこのためです。

完了ブロック内の完了ブロックからpedometerDataを使用するか、完了ブロックの結果を処理するメソッド/代理人を呼び出す必要があります。

関連する問題