我正在尝试制作一个锻炼应用程序,用户的心率会显示在 Apple Watch 上。我一直在关注 Apple 的 WWDC“锻炼锻炼的新方法”视频。这是链接 https://developer.apple.com/videos/play/wwdc2018/707/?time=615
无论如何,每次我尝试运行该应用程序时,我都会不断收到错误消息“线程 1: fatal error 在展开可选值时意外发现 nil”
session = try HKWorkoutSession(healthStore: healthStore, configuration: configuration)
我尝试在“尝试”之后添加一个问号 (?),但所做的只是防止应用程序崩溃并且不会开始锻炼。这是完整的代码。附言我对 Swift 还很陌生,我发现新的 HealthKit 还没有太多示例代码,这让我非常沮丧。 (我知道它相当新,但仍然令人沮丧:D)。感谢您的帮助
class InterfaceController: WKInterfaceController, HKWorkoutSessionDelegate, HKLiveWorkoutBuilderDelegate {
let healthStore = HKHealthStore()
var configuration: HKWorkoutConfiguration!
var session: HKWorkoutSession!
var builder: HKLiveWorkoutBuilder!
func startWorkoutWithHealthStore(){
// configuration.activityType = .crossTraining
// configuration.locationType = .indoor
do {
session = try? HKWorkoutSession(healthStore: healthStore, configuration: configuration)
} catch {
// let the user know about the error
return
}
builder = session.associatedWorkoutBuilder()
//Setup session and builder
session.delegate = self
builder.delegate = self
builder.dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)
//Start Session & Builder
session.startActivity(with: Date())
builder.beginCollection(withStart: Date()) { (success, error) in
self.setDurationTimerDate() //Start the elapsed time timer
}
}
@IBAction func startButtonClicked() {
print("Start BTN clicked")
startWorkoutWithHealthStore()
}
//Track Elapsed Time
func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder){
print("Collection Started")
setDurationTimerDate()
}
func setDurationTimerDate(){
print(", duration timer started"
)
//Create WKInterfaceTimer Date
let timerDate = Date(timeInterval: -self.builder.elapsedTime, since: Date())
DispatchQueue.main.async {
self.timer.setDate(timerDate)
}
//Start or stop timer
let sessionState = self.session.state
DispatchQueue.main.async {
sessionState == .running ? self.timer.start() : self.timer.stop()
}
}
// MARK: HKLiveWorkoutBuilderDelegate
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>){
for type in collectedTypes{
guard let quantityType = type as? HKQuantityType else {
return // Do nothing
}
let statistics = workoutBuilder.statistics(for: quantityType)
//let label = labelForQuantityType(quantityType)
// updateLabel(wkLabel, withStatistics: statistics)
print(statistics as Any)
}
}
// MARK: State Control
func stopWorkout(){
session.end()
builder.endCollection(withEnd: Date()) { (success, error) in
self.builder.finishWorkout(completion: { (workout, error) in
self.dismiss()
})
}
}
}
最佳答案
您不应该使用 HKWorkoutSession(healthStore: healthStore, configuration: configuration) 抛出的 try? 将错误隐藏到 Optional 中,特别是如果您已经将语句放在 do-catch block 中。你会崩溃,因为 session 被定义为一个隐式解包的可选(! 标记在类型之后),它不应该是。
如果 session 可能有一个 nil 值,您应该将它定义为一个普通的可选值,并且在您每次访问它时安全地解包/可选链接它。
class InterfaceController: WKInterfaceController, HKWorkoutSessionDelegate, HKLiveWorkoutBuilderDelegate {
let healthStore = HKHealthStore()
let configuration = HKWorkoutConfiguration()
var session: HKWorkoutSession? = nil
var builder: HKLiveWorkoutBuilder? = nil
func startWorkoutWithHealthStore(){
configuration.activityType = .crossTraining
configuration.locationType = .indoor
do {
session = try HKWorkoutSession(healthStore: healthStore, configuration: configuration)
} catch {
print(error)
session = nil
return
}
builder = session?.associatedWorkoutBuilder()
//Setup session and builder
session?.delegate = self
builder?.delegate = self
builder?.dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)
//Start Session & Builder
session?.startActivity(with: Date())
builder?.beginCollection(withStart: Date()) { (success, error) in
self.setDurationTimerDate() //Start the elapsed time timer
}
}
...
}
关于swift - 尝试启动 HKLiveWorkout 在 session 中意外发现 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53171250/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于