У меня есть ViewController, который вызывает класс HKQueryWeight, который запускает запрос HealthKit (очень, очень медленный btw) и сохраняет данные в CoreData. Если пользователь покидает VC до того, как запрос завершен, приложение выйдет из строя.Индикатор активности останавливается перед завершением асинхронного запроса
fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)
Первоначально я думал, что я мог бы исправить это путем добавления activityIndicator, который начинается анимация в viewDidAppear и останавливается в конце последней функции в ВК. Оно работает. Однако из-за, я считаю, асинхронного характера запросов HealthKit, анимация останавливается до завершения фактического запроса healthKit.
- Вопрос: Как создать решение, в котором анимация прекращается только после завершения последнего запроса HealthKit?
Я не уверен, если это необходимо предоставить код, но я сделал это в случае полезно
ViewController:
class ViewController: UIViewController {
@IBOutlet var activityIndicator: UIActivityIndicatorView!
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
activityIndicator.startAnimating()
setupArrays()
}
func setupArrays(){
println("setting up arrays")
if NSUserDefaults.standardUserDefaults().boolForKey("hrSwitch") == true {
var hkQueryHeartRate = HKQueryHeartRate()
hkQueryHeartRate.performHKQuery()
}
if NSUserDefaults.standardUserDefaults().boolForKey("weightSwitch") == true {
var hkQueryWeight = HKQueryWeight()
hkQueryWeight.performHKQuery()
}
self.activityIndicator.stopAnimating()
}
HKQuery
import Foundation
import CoreData
import HealthKit
class HKQueryWeight: HKQueryProtocol {
func performHKQuery() {
var appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
var context = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
let healthKitManager = HealthKitManager.sharedInstance
let calendar = NSCalendar.currentCalendar()
let interval = NSDateComponents()
interval.day = 1
// Set the anchor date to Monday at 3:00 a.m.
let anchorComponents =
calendar.components(.CalendarUnitDay | .CalendarUnitMonth |
.CalendarUnitYear | .CalendarUnitWeekday, fromDate: NSDate())
let offset = (7 + anchorComponents.weekday - 2) % 7
anchorComponents.day -= offset
anchorComponents.hour = 3
//let now = NSDate()
let anchorDate = calendar.dateFromComponents(anchorComponents)
let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)
// Create the query
let query = HKStatisticsCollectionQuery(quantityType: quantityType,
quantitySamplePredicate: nil,
options: .DiscreteAverage,
anchorDate: anchorDate,
intervalComponents: interval)
// Set the results handler
query.initialResultsHandler = {
query, results, error in
if error != nil {
// Perform proper error handling here
println("*** An error occurred while calculating the statistics: \(error.localizedDescription) ***")
abort()
}
let endDate = NSDate()
let startDate =
calendar.dateByAddingUnit(.MonthCalendarUnit,
value: -6, toDate: endDate, options: nil)
// Plot the weekly step counts over the past 6 months
results.enumerateStatisticsFromDate(startDate, toDate: endDate) {
statistics, stop in
if let quantity = statistics.averageQuantity() {
let date = statistics.startDate
let weight = quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(.Kilo))
println("weight date: \(date)")
println("weight value: \(weight)")
var weightData = NSEntityDescription.insertNewObjectForEntityForName("HKWeight", inManagedObjectContext: context) as HKWeight
//Saving to CoreData
weightData.setValue(weight, forKey: "weight_data")
weightData.setValue(date, forKey: "weight_date")
context.save(nil)
}
}
}
healthKitManager.healthStore.executeQuery(query)
}
}
Я получаю сообщение об ошибке: "Ожидаемое выражение после оператора для линии: если (notificationCount == 2) { – KML
Будет ли это решение на самом деле держать счета, сколько NSUserDefaults. Станда rdUserDefaults() оценивается как true? – KML
@karlml # 1, что ошибка должна исчезнуть после моего обновления. Просто получается, что swift не позволяет выполнять отдельную операцию notificationCount ++. –