2017-06-18 10 views
0

私のXamarin.iOSアプリケーションで追加されたHKObjectを削除しようとしています。 Apple HealthKitからデータを正常に保存してクエリできますが、HKHealthStore.DeleteObjectAsync(およびHKHealthStore.DeleteObject)メソッドは実行後に消えます。エラーは返されず、次のコード行はヒットしません。以下は、問題を再現するために使用できるサンプルコードです。応答または例外がないため、この問題のトラブルシューティングを開始する場所がわかりません。誰でもXamarin.iOSで動作するDeleteObjectAsync(またはDeleteObject)をどのように取得できるか知っていますか?私のHKHealthStore.DeleteObjectAsyncメソッドがXamarinでオブジェクトを実行して返していないのはなぜですか?

私が使用しているAsyncHelpersクラスのコードはhereです。

Zipped Project

public partial class ViewController : UIViewController 
{ 
    string Id => "54b50df8-35ab-4f53-ac19-0ad0c3d3551a"; 

    protected ViewController(IntPtr handle) : base(handle) 
    { 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
    } 

    partial void AddUsage(UIButton sender) //<- Button TouchUpInside 
    { 
     Tuple<HKUnit, double> entryItems = new Tuple<HKUnit, double>(HKUnit.CreateLiterUnit(HKMetricPrefix.Milli), 10); 

     HKQuantity quantity = HKQuantity.FromQuantity(entryItems.Item1, entryItems.Item2); 
     HKQuantityType qType = HKQuantityType.Create(HKQuantityTypeIdentifier.DietaryWater); 
     HKMetadata metadata = new HKMetadata { ExternalUuid = Id }; 
     HKQuantitySample sample = HKQuantitySample.FromType(qType, quantity, new NSDate(), new NSDate(), metadata); 
     using (HKHealthStore store = new HKHealthStore()) 
     { 
      AsyncHelpers.RunSync(async() => 
      { 
       Tuple<bool, NSError> saveResult = await store.SaveObjectAsync(sample); 
      }); 

     } 
    } 

    partial void DeleteUsage(UIButton sender) //<- Button TouchUpInside 
    { 
     using (HKHealthStore store = new HKHealthStore()) 
     { 
      NSCalendar calendar = NSCalendar.CurrentCalendar; 
      NSDate now = new NSDate(); 
      NSDateComponents components = calendar.Components(NSCalendarUnit.Year | NSCalendarUnit.Month | NSCalendarUnit.Day, now); 
      NSDate startDate = calendar.DateByAddingUnit(NSCalendarUnit.Day, -2, now, NSCalendarOptions.None); 
      NSDate endDate = calendar.DateByAddingUnit(NSCalendarUnit.Day, 1, now, NSCalendarOptions.None); 
      HKQuantityType qType = HKQuantityType.Create(HKQuantityTypeIdentifier.DietaryWater); 
      NSPredicate pred = HKQuery.GetPredicateForSamples(startDate, endDate, HKQueryOptions.None); 
      HKSampleQuery query = new HKSampleQuery(qType, pred, 0, null, (sampleQuery, results, error) => 
      { 
       HKObject[] arr = results.Where(r => r.Metadata.ExternalUuid == Id).ToArray(); 
       if (arr.Length > 0) 
       { 
        AsyncHelpers.RunSync(async() => 
         { 
          Tuple<bool, NSError> deleteResult = await store.DeleteObjectAsync(arr.First()); // <- The breakpoint on this line is hit 
          string s = "s"; // <- The breakpoint on this line isn't ever hit 
         }); 
       } 
      }); 
      store.ExecuteQuery(query); 
     } 
    } 
} 

答えて

1

カップルの事:

1)あなたはアプリごとに1つだけHealthKitストアを必要とするHealthKit docs

パー。これらは長命のオブジェクトです。ストアを一度作成し、後で使用できるように参照を保管してください。

したがって、usingステートメントにHKHealthStoreをラップするべきではありません。

2)あなたのAsyncHelpersは、削除しようとするとバックグラウンドスレッドのコールバックのコンテキストにいるため、例外を食べているか、他の何かをする可能性があります。

この更新されたコードは動作します:

public partial class ViewController : UIViewController 
{ 
    HKHealthStore Store = new HKHealthStore(); 

    string Id => "54b50df8-35ab-4f53-ac19-0ad0c3d3551a"; 

    protected ViewController(IntPtr handle) : base(handle) 
    { 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
    } 

    partial void AddUsage(UIButton sender) //<- Button TouchUpInside 
    { 
     Tuple<HKUnit, double> entryItems = new Tuple<HKUnit, double>(HKUnit.CreateLiterUnit(HKMetricPrefix.Milli), 10); 

     HKQuantity quantity = HKQuantity.FromQuantity(entryItems.Item1, entryItems.Item2); 
     HKQuantityType qType = HKQuantityType.Create(HKQuantityTypeIdentifier.DietaryWater); 
     HKMetadata metadata = new HKMetadata { ExternalUuid = Id }; 
     HKQuantitySample sample = HKQuantitySample.FromType(qType, quantity, new NSDate(), new NSDate(), metadata); 

     Task.Run(async() => 
     { 
      try 
      { 
       var save = await Store.SaveObjectAsync(sample); 
       System.Diagnostics.Debug.WriteLine($"{save}"); 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.WriteLine($"{ex}"); 
      } 
     }); 
    } 

    partial void DeleteUsage(UIButton sender) //<- Button TouchUpInside 
    { 
     NSCalendar calendar = NSCalendar.CurrentCalendar; 
     NSDate now = new NSDate(); 
     NSDateComponents components = calendar.Components(NSCalendarUnit.Year | NSCalendarUnit.Month | NSCalendarUnit.Day, now); 
     NSDate startDate = calendar.DateByAddingUnit(NSCalendarUnit.Day, -2, now, NSCalendarOptions.None); 
     NSDate endDate = calendar.DateByAddingUnit(NSCalendarUnit.Day, 1, now, NSCalendarOptions.None); 
     HKQuantityType qType = HKQuantityType.Create(HKQuantityTypeIdentifier.DietaryWater); 
     NSPredicate pred = HKQuery.GetPredicateForSamples(startDate, endDate, HKQueryOptions.None); 
     HKSampleQuery query = new HKSampleQuery(qType, pred, 0, null, (sampleQuery, results, error) => 
     { 
      HKObject[] arr = results.Where(r => r.Metadata.ExternalUuid == Id).ToArray(); 
      if (arr.Length > 0) 
      { 
       Task.Run(async() => 
       { 
        try 
        { 
         var delete = await Store.DeleteObjectAsync(arr.First()); 
         System.Diagnostics.Debug.WriteLine($"{delete}"); 
        } 
        catch (Exception ex) 
        { 
         System.Diagnostics.Debug.WriteLine($"{ex}"); 
        } 
       }); 
      } 
     }); 
     Store.ExecuteQuery(query); 
    } 
} 
+0

DeleteObjectAsyncコールがかつて働いていた私はHKHealthStoreのため使用してブロックを削除 - 感謝を – mpt1555

関連する問題