- Published on
CloudKit 3: Rasm va fayllarni (CKAsset) bazaga yuklash
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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:
UIImageni Data (ikkilik sanoq tizimidagi ma'lumot) ga o'giramiz.- Bu ma'lumotni telefonning vaqtinchalik xotirasiga (File Manager - Caches) saqlaymiz va uning URL manzilini olamiz.
- Shu manzil orqali yangi
CKAssetyaratamiz. CKAssetni 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!