我在一个iOS-Swift项目中使用firebase,在该项目中,我必须启用离线支持来上传帖子,帖子中有图片和标题,就像Instagram,所以我想要的是用户离线时他/她想上传帖子,他/她的图片将保存在缓存中,当用户上线时,该照片将上传并返回一个可用于保存帖子的下载网址-将其详细保存在数据库中。
示例代码为:
let photoIDString = UUID().uuidString
let storageRef = Storage.storage().reference(forURL: "storage ref URL").child("posts").child(photoIDString)
storageRef.putData(imageData, metadata: nil, completion: { (metadata, error) in
guard let metadata = metadata else {
return
}
if error != nil {
return
}
storageRef.downloadURL(completion: { ( url, error ) in
guard let downloadURL = url else {
return
}
let photoUrl = downloadURL.absoluteString
self.sendDataToDatabase(photoUrl: photoUrl)
})
}
)
我想知道我应该对代码进行哪些更改以提供脱机功能。任何代码段都将提供更多帮助。
答案 0 :(得分:0)
问题最好是在出现错误时将视图重新发送到服务器。 对于离线情况,您可以检查错误返回是否是网络错误,或者手动检查网络连接可用性。
您可以创建一个重新发送的对象数组 例如
var resendList : [YourObjectType]
// when failed to send to server
resendList.append(yourFailedObject)
然后有2个解决方案:
手动检查网络连接,并在appDelegate的func applicationDidBecomeActive(_ application: UIApplication)
中激活该应用程序后重新上传。要检查连接性,您可以在此处尝试使用该方法:Check for internet connection with Swift但这有一个问题,用户必须退出应用程序并已连接网络
使用https://stackoverflow.com/a/27310748/4919289的建议方法跟踪连接变化(听通知)并将其重新上传到服务器
并遍历resendList中的所有对象,然后再次重新上传。
答案 1 :(得分:0)
我不是iOS开发人员,但是我可以共享逻辑流程和一些参考。
用户单击上传时:检查网络是否可用?
如果您正在寻找Firebase提供的解决方案,您可能会发现更多详细信息here。
答案 2 :(得分:0)
Firebase在其文档中为您提供了许多方法来执行此操作。 https://firebase.google.com/docs/database/ios/offline-capabilities
上传到Firebase服务器时,它将排队等待并等待再次连接到互联网。如果发生超时或您想以自己的方式进行操作,则只需尝试在setValue
或updateChild
函数上使用完成处理程序上载-如果未成功,并且错误消息是由于Internet引起的,则添加它到手机的本地缓存中,其中包含数据和Firebase服务器的路径。
onLoad,一旦成功,再次尝试相同的上传,直到成功-清除本地缓存。