2017-06-18 20 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)每HealthKit docs

你只需要每個應用程序的單一HealthKit店。這些是長壽命的物體。創建一次商店,並保留供以後使用的參考。

所以,你不應該在一個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

相關問題