当前位置: 首页 > 知识库问答 >
问题:

如何使用Firebase更新WhatsApp等好友图片

庄博厚
2023-03-14

我在使用Firebase存储和实时数据库的聊天应用程序上工作。我在我的数据库中有一个用户朋友树,每个用户在那里得到他的朋友列表:

我在存储中每个用户都有详细的照片,下载用户朋友的照片的最佳方式/逻辑是什么(到带有NSUrl的本地文件/在内存中使用NSData/生成URL),如果朋友修改他的照片,更重要的是要更新?感谢您的帮助!

共有1个答案

宋宇
2023-03-14

用于存储图像

参数

信息图片:- 您UI 图像拾取器发送的图片的信息

完成块:- 上传完成时调用

func profilePictureUploading(infoOnThePicture : [String : AnyObject],completionBlock : (()->Void)) {

    if let referenceUrl = infoOnThePicture[UIImagePickerControllerReferenceURL] {
        print(referenceUrl)

        let assets = PHAsset.fetchAssetsWithALAssetURLs([referenceUrl as! NSURL], options: nil)
        print(assets)

        let asset = assets.firstObject
        print(asset)

        asset?.requestContentEditingInputWithOptions(nil, completionHandler: { (ContentEditingInput, infoOfThePicture)  in

            let imageFile = ContentEditingInput?.fullSizeImageURL
            print("imagefile : \(imageFile)")

            let filePath = FIRAuth.auth()!.currentUser!.uid +  "/\(Int(NSDate.timeIntervalSinceReferenceDate() * 1000))/\(imageFile!.lastPathComponent!)"
            //Creating a unique path for the image in FIRStorage

            print("filePath : \(filePath)")


           //Storing under the parent Node `ProfilePictures` in FIRStorage     FIRControllerClass.storageRef.child("ProfilePictures").child(filePath).putFile(imageFile!, metadata: nil, completion: {

                    (metadata, error) in

                         if error != nil{

                            print("error in uploading image : \(error)")

                           //Show alert
                         }
                          else{

                                print("metadata in : \(metadata!)")

                                print(metadata?.downloadURL())

                                print("The pic has been uploaded")

                                print("download url : \(metadata?.downloadURL())")

                                self.uploadSuccess(metadata!, storagePath: filePath)

                                completionBlock()
                    }

            })
        })

    }else{

            print("No reference URL found!")

    }
}

//Storing the filepath to NSUserDefaults
 //Much better option would be to store the pictures filePath or storagePath in the FIREBASE DATABASE ITSELF WITH THE USERS DETAILS
 //And retrieve that storagePath every time you wanna download the image(much sound option)
 func uploadSuccess(metadata : FIRStorageMetadata , storagePath : String)
{
    print("upload succeded!")

    print(storagePath)

    NSUserDefaults.standardUserDefaults().setObject(storagePath, forKey: "storagePath.\((FIRAuth.auth()?.currentUser?.uid)!)")

    NSUserDefaults.standardUserDefaults().synchronize()

}

用于检索图像

参数 :-

用户名:- 用户标识

完成 :- 完成用于处理图像检索完成的块

  func retrieveStorageForUID( UID : String, completion : ((image : UIImage) -> Void) ){
    print("initial storage")

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let documentDirectory = paths[0]
    let filePath = "file:\(documentDirectory)/\(UID).jpg"
    let filePath1 = "\(documentDirectory)/\(UID).jpg"
    print(filePath)
    print(filePath1)

    //Again i am retrieving the storagePath from the NSUserDefaults but you can retrieve it from Firebase database if you stored it while uploading.
    if let storagePath = NSUserDefaults.standardUserDefaults().objectForKey("storagePath.\(UID)") as? String {

        print(storagePath)

        FIRControllerClass.storageRef.child("ProfilePictures").child(storagePath).writeToFile(NSURL.init(string: filePath)!, completion: {(url, err) -> Void in


            if err != nil{


                self.delegate.firShowAlert("Error downloading", Message: "There was an error downloading your profile picture")


            }else{

                if let downloadedImage = UIImage(contentsOfFile: filePath1){

                    print("DOWNLOADED IMAGE :\(downloadedImage)")

                    self.profilePicture = downloadedImage

                    completion(image : self.profilePicture)
            }
        }

    })
}else{
    completion(image: UIImage(named: "defaultProfilePic")!)
     //Default profile pic or Placeholder picture if there is no picture from the user...which you can also download from the FIRStorage..think
    }
}

至于检查您的朋友何时更改其个人资料图片,当用户更改其个人资料图片时,您将在存储中替换用户图片,并将其链接存储在数据库中,并且为了了解用户何时更改其个人资料图片,请使用.observeEventType(.儿童已更改,..这将通知您该位置的更改,然后通过dispatch_异步更新您的UI

PS:-参考Firebase的官方示例,您正在本项目中寻找身份验证:https://github.com/firebase/quickstart-ios

 类似资料:
  • 问题内容: .htaccess我很难受。我想为我正在工作的网站创建友好的URL。 基本上我想将其转换为: 变成这个: 如果以后需要,我也想知道如何将文章标题添加到URL的末尾(如下所示)(我正在使用PHP): 注意:Stackoverflow方法对我也有好处,例如,此问题的网址为: 但是您可以在id后面放任何东西,它也可以工作。像这样: 我使用了一些自动Web工具来创建.htacces文件,但该文

  • 这是一个众所周知的问题,当您在Windows上更新Java、JDK或JRE时,Eclipse很可能无法启动,因为它指向过时的JDK/JJRE文件夹。修复是相对简单的,它是在这里或这里的几个线程上讨论和解决的。 但我发现这些解决方案缺乏灵活性,令人不满意。此解决方案建议在转换为: 这意味着你必须在每次更新后,一次又一次地进行。如果您经常更新JDK,并且每个人都应该有最新的安全补丁,这会使它非常烦人。

  • 我有一个有大约200张幻灯片的PowerPoint演示文稿。每张幻灯片都有一个图表,其中的数据通过到主xlsx文件的链接每月更新一次。 为了不在图表中显示空值(未来月份),我打开数据编辑器(图表右键单击>Edit data...)并选择直到当前月份的范围。 我在PowerPoint中为它写了一个宏:

  •         目前只有电脑端能进行好友分组,移动端只能同步电脑端好友分组情况,并显示分组详细信息,暂不支持好友分组功能。 1)进入我的好友列表,新增分组 2)对分组列表进行重命名、删除操作。 3)对分组下的成员进行移动分组操作。

  • 您好,我目前正在使用Recyclerview ListAdapter,我想知道什么是等价的通知DataSetChanged或如何在添加值/记录后更新整个列表。? 我目前使用过此方法,但如果不刷新,则不会更新。 我想回到回收器视图。适配器和通知数据设置更改()。这样我的问题就解决了,你觉得怎么样?提前谢谢。

  • 我有多个微服务,我使用docker compose进行开发部署。当microservices代码库中有一些更改时,我会触发ci作业来重新部署它们。我有下面的脚本来做这件事。但每次我都必须从头开始构建所有图像,然后运行它们。完成所有这些操作后,我得到了图像。所以我使用最后一个脚本来删除它们。你有什么建议使这个过程更实用?是否有任何方法可以更新现有图像而不使用新的更改将其删除? 其他信息:我正在使用