Evernote:如何获取笔记的上传进度?
Evernote: How can I get the upload progress for a note?
我的应用程序录制音频,然后使用生成的音频文件作为资源(以及当前日期和时间作为标题)创建一个 ENNote,并将此笔记上传到 Evernote。上传完成后,用户会收到通知。现在我还想显示上传进度。所以我正在使用这个功能:
ENSession.shared.upload(note, policy: .create, to: nil, orReplace: nil, progress: progressHandler, completion: completionHandler)
一切正常,除了 从未调用 progressHandler。
我搜索了印象笔记SDK,在几个地方找到了这种代码:
#if EN_PROGRESS_HANDLERS_ENABLED
if (context.progress) {
context.noteStore.uploadProgressHandler = context.progress;
}
#endif
这个好像有点关系。但我必须说我不熟悉这个#if...#endif 语法。我搜索了示例项目,但找不到实际设置 EN_PROGRESS_HANDLERS_ENABLED 值的地方。
我想也许 progressHandler 只在进度需要足够长的时间时才会被调用,所以我录制了几分钟 (4 MB) 并上传了该录音。上传时间明显变长了,但是progressHandler还是没有被调用。
我在互联网上搜索了很长时间,但一无所获。
为什么从未调用进度处理程序?如何获取ENNote的上传进度?
以下是我的代码的相关部分:
private func sendToEvernote() {
let progressHandler: ENSessionProgressHandler = { progress in
self.progressView.progress = Float(progress)
self.progressView.alpha = 1
print("Progress:", progress) // Never gets printed
}
let completionHandler: ENSessionUploadNoteCompletionHandler = { (noteRef, error) in
if let error = error { print(error.localizedDescription) }
self.noteRef = noteRef
self.progressView.alpha = 0
self.showBanner(text: "Upload complete. Tap here to open in Evernote.")
}
do {
let note = ENNote()
let title = titleFromCurrentDate()
let filename = title + ".m4a"
note.title = title
let data = try Data(contentsOf: audioURL)
guard let resource = ENResource(data: data, mimeType: "audio/mp4a-latm", filename: filename)
else {
alert(title: "Export failed", message: "Audio file could not be attached to note.")
return
}
note.add(resource)
ENSession.shared.upload(note, policy: .create, to: nil, orReplace: nil, progress: progressHandler, completion: completionHandler)
} catch {
alert(title: "Export failed", message: "Audio file could not be converted to Data type.")
}
}
嗯,这是一个预处理器语句。意思是如果编译SDK时定义符号EN_PROGRESS_HANDLERS_ENABLED
为非零值,则里面的代码会被包含(并执行)。
如果您的项目自己构建 SDK,您可以将 EN_PROGRESS_HANDLERS_ENABLED=1
添加到包含 SDK 的目标的 "Preprocessor Macros" 构建设置。 (如果您使用的是 Cocoapods,you'll need to use a post-install hook。)如果 SDK 是预编译的,那您就不走运了。
请注意,我对 Evernote SDK 一点都不熟悉,所以我不知道启用此设置的其他后果。
答案简单而悲伤:
"弃用进度块 - 不幸的是,部分更改意味着最新的 SDK 不再支持进度块。"
https://github.com/evernote/evernote-cloud-sdk-ios/blob/master/3.0_Release_Notes.md
(编辑:据我了解,这意味着目前无法获取上传进度。)
根据 Josh Caswell 的回答,我添加了一个设置 EN_PROGRESS_HANDLERS_ENABLED=1 的预处理器宏。 (虽然我使用的是 CocoaPods,但事实证明这就是它的工作方式。)这样做给了我决定性的线索。控制台打印出:"Progress blocks have been deprecated"。对这句话的互联网搜索使我找到了上面引用的发行说明页面。我想我应该养成阅读发行说明的习惯。
(顺便说一下,progressHandler 现在被调用了,但只调用了一次,进度为 1.0,即使录制了更长的时间也是如此。)
如果没有 Josh Caswell 的回答,我就不会知道。我仍然认为我应该写下我自己的答案,因为对于任何遇到这个问题的人来说,Josh 的答案并不是问题的答案,尽管这是重要的一步。
编辑:现在我发现 GitHub 上已经有对应的 issue。
我的应用程序录制音频,然后使用生成的音频文件作为资源(以及当前日期和时间作为标题)创建一个 ENNote,并将此笔记上传到 Evernote。上传完成后,用户会收到通知。现在我还想显示上传进度。所以我正在使用这个功能:
ENSession.shared.upload(note, policy: .create, to: nil, orReplace: nil, progress: progressHandler, completion: completionHandler)
一切正常,除了 从未调用 progressHandler。 我搜索了印象笔记SDK,在几个地方找到了这种代码:
#if EN_PROGRESS_HANDLERS_ENABLED
if (context.progress) {
context.noteStore.uploadProgressHandler = context.progress;
}
#endif
这个好像有点关系。但我必须说我不熟悉这个#if...#endif 语法。我搜索了示例项目,但找不到实际设置 EN_PROGRESS_HANDLERS_ENABLED 值的地方。
我想也许 progressHandler 只在进度需要足够长的时间时才会被调用,所以我录制了几分钟 (4 MB) 并上传了该录音。上传时间明显变长了,但是progressHandler还是没有被调用。
我在互联网上搜索了很长时间,但一无所获。 为什么从未调用进度处理程序?如何获取ENNote的上传进度?
以下是我的代码的相关部分:
private func sendToEvernote() {
let progressHandler: ENSessionProgressHandler = { progress in
self.progressView.progress = Float(progress)
self.progressView.alpha = 1
print("Progress:", progress) // Never gets printed
}
let completionHandler: ENSessionUploadNoteCompletionHandler = { (noteRef, error) in
if let error = error { print(error.localizedDescription) }
self.noteRef = noteRef
self.progressView.alpha = 0
self.showBanner(text: "Upload complete. Tap here to open in Evernote.")
}
do {
let note = ENNote()
let title = titleFromCurrentDate()
let filename = title + ".m4a"
note.title = title
let data = try Data(contentsOf: audioURL)
guard let resource = ENResource(data: data, mimeType: "audio/mp4a-latm", filename: filename)
else {
alert(title: "Export failed", message: "Audio file could not be attached to note.")
return
}
note.add(resource)
ENSession.shared.upload(note, policy: .create, to: nil, orReplace: nil, progress: progressHandler, completion: completionHandler)
} catch {
alert(title: "Export failed", message: "Audio file could not be converted to Data type.")
}
}
嗯,这是一个预处理器语句。意思是如果编译SDK时定义符号EN_PROGRESS_HANDLERS_ENABLED
为非零值,则里面的代码会被包含(并执行)。
如果您的项目自己构建 SDK,您可以将 EN_PROGRESS_HANDLERS_ENABLED=1
添加到包含 SDK 的目标的 "Preprocessor Macros" 构建设置。 (如果您使用的是 Cocoapods,you'll need to use a post-install hook。)如果 SDK 是预编译的,那您就不走运了。
请注意,我对 Evernote SDK 一点都不熟悉,所以我不知道启用此设置的其他后果。
答案简单而悲伤:
"弃用进度块 - 不幸的是,部分更改意味着最新的 SDK 不再支持进度块。"
https://github.com/evernote/evernote-cloud-sdk-ios/blob/master/3.0_Release_Notes.md
(编辑:据我了解,这意味着目前无法获取上传进度。)
根据 Josh Caswell 的回答,我添加了一个设置 EN_PROGRESS_HANDLERS_ENABLED=1 的预处理器宏。 (虽然我使用的是 CocoaPods,但事实证明这就是它的工作方式。)这样做给了我决定性的线索。控制台打印出:"Progress blocks have been deprecated"。对这句话的互联网搜索使我找到了上面引用的发行说明页面。我想我应该养成阅读发行说明的习惯。
(顺便说一下,progressHandler 现在被调用了,但只调用了一次,进度为 1.0,即使录制了更长的时间也是如此。)
如果没有 Josh Caswell 的回答,我就不会知道。我仍然认为我应该写下我自己的答案,因为对于任何遇到这个问题的人来说,Josh 的答案并不是问题的答案,尽管这是重要的一步。
编辑:现在我发现 GitHub 上已经有对应的 issue。