PhotoKit — এটি কী, মূল ধারণা এবং PHAsset

লেখক: IT Sectr প্রকাশিত: 2026-05-06 পড়ার সময়: 8 মিনিট

PhotoKit হল iOS এবং macOS-এ মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য Apple-এর ফ্রেমওয়ার্ক, যা ডিভাইসে ফটো, ভিডিও এবং Live Photos-এ সরাসরি অ্যাক্সেস প্রদান করে। Apple-এর ডকুমেন্টেশন অনুসারে, ফ্রেমওয়ার্কটি পুরনো AssetsLibrary-কে প্রতিস্থাপন করে এবং iCloud, অ্যালবাম, সম্পাদনা এবং Change Tracking সমর্থন করে। PhotoKit iCloud-এর মাধ্যমে স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন সহ কুয়েরি, ক্যাশিং এবং মিডিয়া লাইব্রেরি পরিবর্তনের জন্য একটি ইউনিফাইড API প্রদান করে।

মূল বিষয়

  • PhotoKit সিস্টেম মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য Apple-এর ফ্রেমওয়ার্ক, যা ফটো, ভিডিও, Live Photos এবং অ্যালবামে অ্যাক্সেস প্রদান করে।
  • PHAsset একটি ডেটা মডেল যা মেটাডেটা সহ একটি মিডিয়া আইটেম (ফটো বা ভিডিও) উপস্থাপন করে: তারিখ, অবস্থান, ধরন।
  • PHFetchResult PHPhotoLibraryChangeObserver-এর মাধ্যমে লেজি লোডিং এবং পরিবর্তন বিজ্ঞপ্তি সহ কুয়েরি ফলাফল কন্টেইনার।
  • PHImageManager PHCachingImageManager-এর মাধ্যমে আকার, মোড এবং ক্যাশিং অপশন সহ ছবি পাওয়ার জন্য ম্যানেজার।
  • PHPhotoLibrary পরিবর্তন সম্পাদনের জন্য এন্ট্রি পয়েন্ট: মিডিয়া অবজেক্ট তৈরি, মুছে ফেলা এবং সম্পাদনা করা।

PhotoKit কী?

PhotoKit হল Apple-এর ফ্রেমওয়ার্ক (iOS 8, macOS 10.11-এ প্রবর্তিত) যা সিস্টেম মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য অবজেক্ট-ওরিয়েন্টেড API প্রদান করে। AssetsLibrary-এর বিপরীতে, PhotoKit মিডিয়া লাইব্রেরিকে ডেটাবেস হিসেবে বিবেচনা করে: কুয়েরি PHAsset, PHCollection এবং PHCollectionList অবজেক্ট ফেরত দেয় যা বিষয়বস্তু এবং স্টোরেজ কাঠামো উপস্থাপন করে।

PhotoKit সব ধরনের মিডিয়া সমর্থন করে: ফটো (JPEG, HEIF, RAW), ভিডিও (MOV, MP4), Live Photos এবং বার্স্ট শট। ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে iCloud সিঙ্ক্রোনাইজেশন পরিচালনা করে: যদি একটি ছবি iCloud-এ সংরক্ষিত থাকে, PhotoKit তা নেটওয়ার্কের মাধ্যমে অনুরোধ করে এবং PHImageRequestOptions.progressHandler-এর মাধ্যমে অগ্রগতি জানায়।

PhotoKit-এর মূল বৈশিষ্ট্য হল PHObject-এর উপর ভিত্তি করে ডেটা মডেল যার একটি স্থানীয় আইডেন্টিফায়ার (localIdentifier) রয়েছে যা সেশনের মধ্যে স্থিতিশীল থাকে। এটি আপনাকে মিডিয়া অবজেক্টের রেফারেন্স সংরক্ষণ করতে এবং পুনরায় কুয়েরি না করে অ্যাপ পুনরারম্ভের পরে সেগুলি পুনরুদ্ধার করতে দেয়।

PhotoKit কীভাবে কাজ করে: ডেটা মডেল এবং কুয়েরি

PhotoKit তিনটি স্তরে নির্মিত: ডেটা মডেল (PHObject), কুয়েরি (PHFetchResult) এবং পরিবর্তন (PHPhotoLibrary.performChanges)। ডেটা মডেলটি শ্রেণিবদ্ধ: PHAsset (ফটো/ভিডিও) PHAssetCollection (অ্যালবাম)-এর ভিতরে অবস্থিত, এবং অ্যালবামগুলি PHCollectionList (ফোল্ডার)-এ গোষ্ঠীভুক্ত হয়।

কুয়েরি সম্পাদন

কুয়েরি PHAsset.fetchAssets এবং PHAssetCollection.fetchAssetCollections-এর মাধ্যমে সম্পাদিত হয়। সব fetch পদ্ধতি সিঙ্ক্রোনাস এবং PHFetchResult ফেরত দেয়, যা তাৎক্ষণিকভাবে মিডিয়া লাইব্রেরি ডেটাবেসের বিরুদ্ধে কুয়েরি সম্পাদন করে। PHFetchResult ইনডেক্স দ্বারা দ্রুত অ্যাক্সেস (object(at:)) এবং enumerateObjects-এর মাধ্যমে গণনা সমর্থন করে।

  • fetchAssets(with:options:) — ধরন, তারিখ, অ্যালবাম অনুসারে ফিল্টার করা সব মিডিয়ার কুয়েরি
  • fetchAssetCollections(with:subtype:options:) — অ্যালবাম এবং ফোল্ডারের কুয়েরি
  • fetchAssets(in:options:) — নির্দিষ্ট অ্যালবামের ভিতরে মিডিয়ার কুয়েরি

PHFetchOptions

PHFetchOptions কুয়েরি কনফিগার করার জন্য অবজেক্ট: সাজানো (sortDescriptors), প্রেডিকেট (predicate), লুকানো এবং মুছে ফেলা মিডিয়া অন্তর্ভুক্ত করা (includeHiddenAssets, includeAllBurstAssets)। Fetch অপশন মিডিয়া ধরন অনুসারে ফিল্টার করার অনুমতি দেয়: PHAssetMediaType.image, .video, .audio.

PhotoKit-এর মূল ক্লাস

PhotoKit-এ মিডিয়া লাইব্রেরি অ্যাক্সেস, কুয়েরি এবং পরিবর্তনের জন্য ক্লাসের একটি সেট অন্তর্ভুক্ত রয়েছে। ফ্রেমওয়ার্কের সাথে কার্যকরভাবে কাজ করার জন্য প্রতিটি বোঝা অপরিহার্য।

PHAsset

PHAsset একটি অপরিবর্তনীয় অবজেক্ট যা একটি মিডিয়া আইটেম উপস্থাপন করে। এতে মেটাডেটা রয়েছে: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (ভিডিওর জন্য), isFavorite, burstIdentifier। LocalIdentifier একটি স্থিতিশীল স্ট্রিং কী যা অ্যাপ পুনরারম্ভের পরেও অ্যাক্সেসযোগ্য।

PHAssetCollection

PHAssetCollection মিডিয়ার একটি গ্রুপ: সিস্টেম অ্যালবাম (Recents, Favorites, Selfies, Screenshots), ব্যবহারকারী অ্যালবাম বা Moments (সময় এবং স্থান অনুসারে স্বয়ংক্রিয়ভাবে গোষ্ঠীভুক্ত)। বৈশিষ্ট্য: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList একটি ফোল্ডার যাতে অ্যালবাম (PHAssetCollection) বা অন্যান্য ফোল্ডার থাকে। এটি খুব কমই ব্যবহৃত হয়, মূলত ব্যবহারকারী ইন্টারফেসে শ্রেণিবিন্যাস প্রদর্শনের জন্য।

PHImageManager এবং ক্যাশিং

PhotoKit সরাসরি PHAsset থেকে UIImage ফেরত দেয় না — আপনাকে PHImageManager-এর মাধ্যমে ছবির অনুরোধ করতে হবে। এটি নিশ্চিত করে যে ছবিটি iCloud সমর্থন, ক্যাশিং এবং প্রয়োজনীয় আকারের সাথে লোড হয়েছে।

উপাদানউদ্দেশ্যবৈশিষ্ট্য
PHImageManager.default()একক অনুরোধের জন্য স্ট্যান্ডার্ড ম্যানেজারঅনুরোধের মধ্যে কোন ক্যাশিং নেই
PHCachingImageManagerসংগ্রহের জন্য প্রিলোডিং সহ ম্যানেজারমসৃণ স্ক্রলিংয়ের জন্য startCachingImages
PHImageRequestOptionsঅনুরোধ সেটিংস: আকার, মোড, ডেলিভারিsynchronous, deliveryMode, progressHandler
PHImageRequestIDবাতিলের জন্য অনুরোধ আইডেন্টিফায়ারcancelImageRequest(PHImageRequestID)

PHImageManager তিনটি ডেলিভারি মোড সমর্থন করে: opportunistic (প্রথমে ছোট সংস্করণ, তারপর পূর্ণ), highQualityFormat (শুধু পূর্ণ মানের) এবং fastFormat (দ্রুততম উপলব্ধ সংস্করণ)। সংগ্রহের জন্য, সর্বদা দৃশ্যমান কোষের জন্য ছবি প্রিলোডিং সহ PHCachingImageManager ব্যবহার করুন।

Swift-এ PhotoKit ব্যবহারের উদাহরণ

PhotoKit কাস্টম গ্যালারি, সম্পাদক এবং মিডিয়া অ্যাপ্লিকেশন তৈরির জন্য ব্যবহৃত হয়। আসুন তিনটি মূল পরিস্থিতি দেখি।

মিডিয়া লাইব্রেরি থেকে সব ফটো পাওয়া

PHAsset.fetchAssets তৈরির তারিখ অনুসারে সাজানো PHFetchOptions সহ কাস্টম ফটো গ্যালারি তৈরির জন্য মৌলিক কুয়েরি। PHFetchResult লেজি লোডিং এবং স্ট্রিমিং অ্যাক্সেস সমর্থন করে।

swift
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(
    key: "creationDate",
    ascending: .false
)]
options.predicate = NSPredicate(
    format: "mediaType == %d",
    PHAssetMediaType.image.rawValue
)

let allPhotos = PHAsset.fetchAssets(with: options)
print("\(allPhotos.count) টি ফটো পাওয়া গেছে")

allPhotos.enumerateObjects { asset, index, stop in
    print("ফটো \(index): \(asset.localIdentifier)")
}

PHFetchResult একটি থ্রেড-সেফ কন্টেইনার। object(at:) এর মাধ্যমে ইনডেক্স দ্বারা অবজেক্ট অ্যাক্সেস করা UI ব্লক করে না, কিন্তু PHImageManager-এর মাধ্যমে ছবির অনুরোধ অ্যাসিঙ্ক্রোনাসভাবে করা উচিত।

ক্যাশিং সহ ছবি লোড করা

PHCachingImageManager প্রিলোডিংয়ের জন্য startCachingImages এবং stopCachingImages পদ্ধতি সহ PHImageManager-এর একটি সাবক্লাস। এটি মসৃণ স্ক্রলিংয়ের জন্য UICollectionView-এ ব্যবহৃত হয়।

swift
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)

// দৃশ্যমান কোষের জন্য প্রিলোড
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// PHImageRequestOptions-এর মাধ্যমে iCloud ফলব্যাক সহ ছবির অনুরোধ
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("iCloud থেকে ডাউনলোড হচ্ছে: \(progress * 100)%")
    }
}

let requestID = cachingManager.requestImage(
    for: asset,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: requestOptions
) { image, info in
    print("ছবি পাওয়া গেছে: \(image?.size ?? .zero)")
}

মিডিয়া লাইব্রেরি সম্পাদনা: পছন্দ যোগ করা

মিডিয়া লাইব্রেরিতে পরিবর্তন PHPhotoLibrary.shared().performChanges-এর মাধ্যমে changeRequest ব্লকের ভিতরে সম্পাদিত হয়। সব অপারেশন ব্যাচ করা হয় এবং লেনদেন হিসেবে প্রয়োগ করা হয়।

swift
PHPhotoLibrary.shared().performChanges {
    let changeRequest = PHAssetChangeRequest(for: asset)
    changeRequest.isFavorite = .true
} completionHandler: { success, error in
    if success {
        print("পছন্দে যোগ করা হয়েছে")
    }
}

Change Tracking-এর মাধ্যমে পরিবর্তন এবং পর্যবেক্ষণ

PhotoKit PHPhotoLibraryChangeObserver প্রোটোকলের মাধ্যমে মিডিয়া লাইব্রেরি পরিবর্তন পর্যবেক্ষণের জন্য একটি পদ্ধতি প্রদান করে। যখন কোন পরিবর্তন ঘটে (সৃষ্টি, মুছে ফেলা, সম্পাদনা), তখন PHChange অবজেক্ট সহ photoLibraryDidChange পদ্ধতি কল করা হয়।

PHChange-এ প্রতিটি কুয়েরি ধরনের জন্য changeDetails থাকে: PHFetchResultChangeDetails যাতে removedIndexes, insertedIndexes, changedIndexes থাকে। এটি UICollectionView-এর জন্য performBatchUpdates-এর মাধ্যমে অ্যানিমেশন সহ UI-তে পরিবর্তন প্রয়োগ করার অনুমতি দেয়।

swift
class PhotosViewController: UIViewController {
    var fetchResult: PHFetchResult>PHAsset>?

    override func viewDidLoad() {
        super.viewDidLoad()
        PHPhotoLibrary.shared().register(self)
    }

    deinit {
        PHPhotoLibrary.shared().unregisterChangeObserver(self)
    }
}

extension PhotosViewController: PHPhotoLibraryChangeObserver {
    func photoLibraryDidChange(_ changeInstance: PHChange) {
        guard let fetchResult,
              let details = changeInstance.changeDetails(for: fetchResult)
        else { return }

        DispatchQueue.main.async {
            self.fetchResult = details.fetchResultAfterChanges
            // collectionView-এ পরিবর্তন প্রয়োগ করুন
        }
    }
}

RAW সম্পাদনা এবং এক্সটেনশন

PhotoKit PHContentEditingInput এবং PHContentEditingOutput পদ্ধতির মাধ্যমে মিডিয়া সম্পাদনা সমর্থন করে। অ্যাপ মূল ডেটা সহ editingInput অনুরোধ করে, পরিবর্তন প্রয়োগ করে এবং editingOutput-এর মাধ্যমে ফলাফল সংরক্ষণ করে। ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে মূল সংরক্ষণ করে, ব্যবহারকারীদের মূল পুনরুদ্ধার করে পরিবর্তন ফিরিয়ে নেওয়ার অনুমতি দেয়।

RAW ফটো (DNG, CR2, NEF) PHAssetResourceManager-এর মাধ্যমে সমর্থিত, যা মূল RAW ফাইলটিতে অ্যাক্সেস প্রদান করে। RAW প্রক্রিয়াকরণের জন্য, CIRAWFilter-এর সাথে CoreImage ব্যবহার করার পরামর্শ দেওয়া হয়, যা তাপমাত্রা, এক্সপোজার এবং তীক্ষ্ণতা সামঞ্জস্য সমর্থন করে। PhotoKit Photo Editing Extension (iOS)-এর মাধ্যমে সম্পাদক এক্সটেনশনও সমর্থন করে — একটি নির্বাচিত ফটো বা ভিডিও প্রক্রিয়া করার জন্য সিস্টেম সম্পাদক থেকে একটি অ্যাপ কল করা যেতে পারে।

PhotoKit কর্মক্ষমতা অপ্টিমাইজেশন

PhotoKit একটি শক্তিশালী কিন্তু সম্পদ-নিবিড় ফ্রেমওয়ার্ক। ভুল ব্যবহার স্ক্রল ল্যাগ এবং অতিরিক্ত মেমরি খরচের কারণ হতে পারে। সর্বোত্তম কর্মক্ষমতার জন্য এই সুপারিশগুলি অনুসরণ করুন।

  • সংগ্রহের জন্য PHCachingImageManager ব্যবহার করুন — দৃশ্যমান +/-1 স্ক্রিন কোষের জন্য ছবি প্রিলোডিং স্ক্রল ল্যাগ দূর করে
  • targetSize সেট করুন — থাম্বনেইলের জন্য কখনই PHImageManagerMaximumSize অনুরোধ করবেন না। কোষের প্রকৃত আকার স্ক্রিন স্কেল দ্বারা গুণ করে ব্যবহার করুন
  • কোষ পুনর্ব্যবহারে অনুরোধ বাতিল করুন — PHImageRequestID সংরক্ষণ করুন এবং prepareForReuse-এ cancelImageRequest কল করুন
  • iCloud অনুরোধ সীমিত করুন — দ্রুত স্ক্রলিংয়ের সময়, isNetworkAccessAllowed = false সেট করুন এবং শুধুমাত্র থামলে iCloud ফটো লোড করুন
  • PHFetchResult ক্যাশ করুন — একই অপশন সহ বারবার fetchAssets নতুন PHFetchResult ফেরত দেয়। ফলাফলটি প্রপার্টি হিসেবে সংরক্ষণ করুন এবং Change Observer-এর মাধ্যমে আপডেট করুন

PHLivePhoto-এর জন্য PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:)-এর মাধ্যমে আলাদা অনুরোধ প্রয়োজন। যে কোষগুলি শুধু ফটো প্রদর্শন করে তাদের জন্য Live Photo অনুরোধ করবেন না — নির্দেশকের জন্য PHLivePhotoBadge ব্যবহার করুন।

সচরাচর জিজ্ঞাসা

PhotoKit কী এবং এটি AssetsLibrary থেকে কীভাবে আলাদা?

PhotoKit মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য Apple-এর আধুনিক ফ্রেমওয়ার্ক, যা iOS 8-এ প্রবর্তিত। পুরনো AssetsLibrary-এর বিপরীতে, PhotoKit PHAsset অবজেক্ট মডেল, দ্রুত অনুসন্ধান সহ PHFetchResult, iCloud সমর্থন এবং পরিবর্তন পর্যবেক্ষণের জন্য Change Tracking প্রদান করে।

PhotoKit-এর মাধ্যমে মিডিয়া লাইব্রেরিতে অ্যাক্সেস অনুরোধ করবেন কীভাবে?

কলব্যাক হ্যান্ডলার সহ PHPhotoLibrary.requestAuthorization(for: .readWrite) কল করুন। .authorized স্ট্যাটাস পাওয়ার পর, আপনি PHAsset.fetchAssets কুয়েরি সম্পাদন করতে পারেন। লেখার অ্যাক্সেসের জন্য .readWrite অনুমতি প্রয়োজন। শুধু পড়ার জন্য — .addOnly.

PHAsset থেকে ছবি কীভাবে পাবেন?

প্যারামিটার সহ PHImageManager.default().requestImage ব্যবহার করুন: asset, targetSize, contentMode এবং PHImageRequestOptions। অ্যাসিঙ্ক্রোনাস পদ্ধতি PHImageRequestID ফেরত দেয়, যা অনুরোধ বাতিল করার অনুমতি দেয়। সংগ্রহের জন্য, প্রিলোডিং সহ PHCachingImageManager ব্যবহার করুন।

মিডিয়া লাইব্রেরিতে পরিবর্তন ট্র্যাক করবেন কীভাবে?

PHPhotoLibrary.shared().register(self)-এর মাধ্যমে একটি পর্যবেক্ষক নিবন্ধন করুন এবং PHPhotoLibraryChangeObserver প্রোটোকল বাস্তবায়ন করুন। photoLibraryDidChange পদ্ধতিতে, প্রতিটি fetchResult-এর জন্য changeDetails সহ PHChange গ্রহণ করুন এবং অ্যানিমেশন সহ UI-তে পরিবর্তন প্রয়োগ করুন।

PhotoKit-এ iCloud ফটো কীভাবে পরিচালনা করবেন?

PHImageRequestOptions-এ, iCloud ডাউনলোড অগ্রগতি ট্র্যাক করার জন্য isNetworkAccessAllowed = true এবং progressHandler সেট করুন। দ্রুত স্ক্রলিংয়ের সময়, নেটওয়ার্ক অ্যাক্সেস অক্ষম করুন এবং স্ক্রল বিলম্ব এড়াতে শুধু স্থানীয় সংস্করণ লোড করুন।

সারসংক্ষেপ

  • PhotoKit মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য Apple-এর ফ্রেমওয়ার্ক, যা iOS 8 এবং macOS 10.11 থেকে AssetsLibrary-এর স্থলে এসেছে।
  • PHAsset স্থানীয় আইডেন্টিফায়ার, ধরন, তারিখ, অবস্থান এবং আকার সহ মূল ডেটা মডেল।
  • PHFetchResult স্টোরেজে সিঙ্ক্রোনাস কুয়েরি সম্পাদন করে এবং ফলাফলে থ্রেড-সেফ অ্যাক্সেস প্রদান করে।
  • PHCachingImageManager প্রিলোডিং সহ সংগ্রহে বিলম্ব ছাড়াই মসৃণ স্ক্রলিং নিশ্চিত করে।
  • Change Tracking PHPhotoLibraryChangeObserver-এর মাধ্যমে UI-কে মিডিয়া লাইব্রেরি পরিবর্তনে তাৎক্ষণিক প্রতিক্রিয়া জানাতে দেয়।
  • iCloud সিঙ্ক্রোনাইজেশন ফ্রেমওয়ার্কে নির্মিত: ছবির অনুরোধ স্বয়ংক্রিয়ভাবে অগ্রগতি সহ iCloud থেকে ডাউনলোড হয়।
  • অপ্টিমাইজেশন — সঠিক targetSize, অনুরোধ বাতিল এবং স্ক্রলিংয়ের সময় iCloud সীমিত করা কর্মক্ষমতার জন্য গুরুত্বপূর্ণ।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন