Published on

CloudKit 3: Rasm va fayllarni (CKAsset) bazaga yuklash

Authors

Oddiy Record va Asset o'rtasidagi farq

Oldingi darsda biz meva nomlarini String formatida to'g'ridan-to'g'ri CKRecord ichiga saqladik. Lekin agar siz ilovaga rasm, video yoki audio yuklamoqchi bo'lsangiz, uni to'g'ridan to'g'ri joylashtirib bo'lmaydi (CloudKit'da "Image" degan tur yo'q).

Katta hajmli ma'lumotlar uchun CKAsset (Fayl aktivi) ishlatiladi. CKAsset foydali tomoni shundaki, siz bazadan minglab qator ma'lumotni yuklab olganingizda, ichidagi yirik rasmlar avtomatik yuklanmaydi (ilovangiz qotib qolmasligi uchun). Buning o'rniga faqat rasmning havolasi (URL) keladi va rasm ekranda ko'rsatilishi kerak bo'lgan paytdagina yuklab olinadi.

1. Rasmni CloudKit ga yuklash (Upload)

Faraz qilaylik bizda SwiftUI dagi bitta UIImage bor. Uni qanday qilib CloudKit ga joylaymiz?

Qadamlar:

  1. UIImage ni Data (ikkilik sanoq tizimidagi ma'lumot) ga o'giramiz.
  2. Bu ma'lumotni telefonning vaqtinchalik xotirasiga (File Manager - Caches) saqlaymiz va uning URL manzilini olamiz.
  3. Shu manzil orqali yangi CKAsset yaratamiz.
  4. CKAsset ni Record ga ulab, yuboramiz.
import CloudKit
import UIKit

func addFruitWithImage(name: String, image: UIImage) {
    let newFruit = CKRecord(recordType: "Fruits")
    newFruit["name"] = name

    // 1. Image -> Data
    guard let imageData = image.jpegData(compressionQuality: 1.0) else { return }

    // 2. Vaqtinchalik fayl manzilini yaratish
    let cacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
    let fileURL = cacheDirectory.appendingPathComponent("vaqtinchalik_rasm.jpg")

    do {
        // Ma'lumotni URL manzilga yozish
        try imageData.write(to: fileURL)

        // 3. O'sha manzil orqali Asset yaratish
        let asset = CKAsset(fileURL: fileURL)

        // 4. Assetni record ga biriktirish
        newFruit["image"] = asset

        // Bazaga saqlash
        saveItem(record: newFruit)

    } catch {
        print("Xatolik: \(error)")
    }
}

CloudKit Dashboard ga kirsangiz, yuklangan rasm yonida "Binary File" deb yozuv turadi va siz uni bosib o'zingiz yuklab olib tekshirishingiz mumkin.

2. Rasmni CloudKit dan yuklab olish (Download)

CloudKit dan mevalarni so'raganimizda, bizga CKRecord keladi. Agar shu record ichida image bo'lsa, u bizga rasm sifatida emas, yana o'sha URL formatida keladi.

// Aytaylik fetch() funksiyamiz ishga tushdi va bizga record keldi
if let imageAsset = record["image"] as? CKAsset {

    // Asset ichidan URL manzilni olamiz
    if let imageURL = imageAsset.fileURL {

        do {
            // URL orqali ma'lumotni yuklab olamiz
            let data = try Data(contentsOf: imageURL)

            // Ma'lumotni rasmsa aylantiramiz
            if let downloadedImage = UIImage(data: data) {
                print("Rasm muvaffaqiyatli yuklandi!")
                // Endi bu rasmni ekranda ko'rsatishimiz mumkin
            }

        } catch {
            print("Rasmni yuklashda xatolik!")
        }
    }
}

Xulosa: CloudKit bilan barcha yirik fayllar (Rasm, Video, Audio) CKAsset yordamida URL orqali almashinadi. Bu dasturning tez ishlashini va ortiqcha megabaytlar sarflanmasligini kafolatlaydi!

Buy mea coffee