แนวปฏิบัติที่ดีที่สุดในการจัดเก็บและอัพโหลดภาพหลายภาพจาก ImagePicker (iOS)

ในแอปพลิเคชันของฉัน ฉันต้องจัดเก็บและอัปโหลดรูปภาพหลายรูปไปยังเซิร์ฟเวอร์โดยใช้ไลบรารี iOS UIImagePickerController มาตรฐาน ขณะนี้ฉันกำลังจัดเก็บการทำงานเพื่อจัดเก็บ UIImagePickerControllerReferenceURL สำหรับไลบรารีรูปภาพ:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let assetURL = info["UIImagePickerControllerReferenceURL"] as? URL {
        assetArray.append(assetURL)   //assetArray globally stored as 'fileprivate var assetArray = [URL]()'
     }
}

อย่างไรก็ตาม ฉันเพิ่งอ่านเจอบางที่ที่กล้องไม่มีคีย์ "UIImagePickerControllerReferenceURL" ดังนั้นวิธีนี้อาจไม่ได้ผลเมื่อฉันไปถึงส่วนของกล้อง ดังนั้น ตอนนี้ฉันกำลังคิดตรรกะของตัวเองใหม่

ฉันใช้ KingFisher ดังนั้นฉันจึงกำลังค้นคว้าเพื่อดูว่าคุณสามารถแคชรูปภาพโดยใช้เฟรมเวิร์กนั้นได้หรือไม่ แต่ฉันไม่แน่ใจ ฉันกำลังอ่านด้วยว่าฉันสามารถคว้า URL ของรูปภาพจากกล้องโดยใช้ API ของรูปภาพ ซึ่งฉันจะลองต่อไป หากทำได้ ฉันจะคว้า URL ของรูปภาพที่กล้องถ่ายไว้ แล้วผนวกเข้ากับ AssetArray

หากนี่เป็นการอัปโหลดรูปภาพเดียว การดำเนินการนี้จะค่อนข้างง่าย แต่เนื่องจากฉันไม่ต้องการขัดขวางประสิทธิภาพของแอปพลิเคชันด้วยการจัดเก็บข้อมูล/อาร์เรย์รูปภาพขนาดใหญ่ งานนี้จึงมีความซับซ้อน

เป็นการดีที่สุดที่จะดำเนินการสิ่งที่ฉันทำต่อไป:

1) ดึง URL ของแต่ละภาพที่ฉันต้องการอัปโหลด และจัดเก็บไว้ในอาร์เรย์ URL ก่อนที่จะอัปโหลดไปยังเซิร์ฟเวอร์ ให้ดึงข้อมูลในรูปแบบ .png ของแต่ละ URL แล้วอัปโหลดรูปภาพไปยังเซิร์ฟเวอร์

2) แคชรูปภาพจริงไว้ที่ใดที่หนึ่ง ดังนั้นเมื่ออัปโหลดไปยังเซิร์ฟเวอร์ รูปภาพจะอยู่ที่นั่นอยู่แล้ว (ไม่จำเป็นต้องแปลงจาก URL -> รูปภาพ) ปัญหาที่นี่คือการมีรูปภาพจำนวนมากอาจเป็นอุปสรรคต่อประสิทธิภาพของแอปหากทำไม่ถูกต้อง

or

3) วิธีการอื่น ๆ

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก. ขอบคุณ!


person Josh O'Connor    schedule 28.12.2016    source แหล่งที่มา


คำตอบ (1)


ฉันพบวิธีแก้ปัญหาโดยใช้ Kingfisher ก่อนอื่น ฉันสร้างวัตถุ ImageCache สำหรับ VC จัดการภาพถ่ายหลายภาพ (คุณต้องนำเข้า Kingfisher):

fileprivate var imageCache: ImageCache = ImageCache(name: "newTaskCache")

หลังจากที่ฉันเลือกภาพถ่ายโดยใช้ UIImagePickerController ฉันจะบันทึก ID เฉพาะในอาร์เรย์สตริง cachedImageIDs:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let image : UIImage = (info[UIImagePickerControllerOriginalImage] as? UIImage)!
    let imageID: String?
    if let assetURL = info["UIImagePickerControllerReferenceURL"] as? URL {
        imageID = assetURL.absoluteString
        cachedImageIDs.append(imageID!)
    }else{
        //camera does not return a UIImagePickerControllerReferenceURL, so unique imageID will be posix time, until I figure out how to get imageURL string
        imageID = String(describing: Date().posixTime())
        cachedImageIDs.append(imageID!)
    }

    imageCache.store(image, forKey: imageID!) {
        print("saved image")
        picker.dismiss(animated: true, completion: nil)
    }
}

เมื่อฉันต้องการดึงภาพกลับคืนมา

func getImages() {
    for id in cachedImageIDs {
        //retrieve image
        imageCache.retrieveImage(forKey: id, options: nil, completionHandler: { (image, cacheType) -> () in
            print(image)
        })
    }
}
person Josh O'Connor    schedule 28.12.2016