PhotoKit — nó là gì, các khái niệm chính và PHAsset

Tác giả: IT Sectr Đã đăng: 2026-05-06 Thời gian đọc: 8 phút

PhotoKit là framework của Apple để làm việc với thư viện phương tiện trên iOS và macOS, cung cấp quyền truy cập trực tiếp vào ảnh, video và Live Photos trên thiết bị. Theo tài liệu của Apple, framework này thay thế AssetsLibrary cũ và hỗ trợ iCloud, album, chỉnh sửa và Change Tracking. PhotoKit cung cấp API thống nhất cho truy vấn, bộ nhớ đệm và thay đổi thư viện phương tiện với đồng bộ tự động qua iCloud.

Các điểm chính

  • PhotoKit là framework của Apple để làm việc với thư viện phương tiện hệ thống, cung cấp quyền truy cập vào ảnh, video, Live Photos và album.
  • PHAsset là mô hình dữ liệu đại diện cho một mục phương tiện (ảnh hoặc video) với siêu dữ liệu: ngày, vị trí, loại.
  • PHFetchResult là vùng chứa kết quả truy vấn với tải chậm và thông báo thay đổi qua PHPhotoLibraryChangeObserver.
  • PHImageManager là trình quản lý để lấy ảnh với các tùy chọn kích thước, chế độ và bộ nhớ đệm qua PHCachingImageManager.
  • PHPhotoLibrary là điểm vào để thực hiện các thay đổi: tạo, xóa và chỉnh sửa các đối tượng phương tiện.

PhotoKit là gì?

PhotoKit là framework của Apple (được giới thiệu trong iOS 8, macOS 10.11) cung cấp API hướng đối tượng để làm việc với thư viện phương tiện hệ thống. Không giống AssetsLibrary, PhotoKit coi thư viện phương tiện như một cơ sở dữ liệu: các truy vấn trả về các đối tượng PHAsset, PHCollectionPHCollectionList đại diện cho nội dung và cấu trúc lưu trữ.

PhotoKit hỗ trợ tất cả các loại phương tiện: ảnh (JPEG, HEIF, RAW), video (MOV, MP4), Live Photos và ảnh chụp liên tiếp. Framework tự động quản lý đồng bộ iCloud: nếu ảnh được lưu trữ trong iCloud, PhotoKit sẽ yêu cầu nó qua mạng và báo cáo tiến trình qua PHImageRequestOptions.progressHandler.

Một tính năng chính của PhotoKit là mô hình dữ liệu dựa trên PHObject với định danh cục bộ (localIdentifier) ổn định giữa các phiên. Điều này cho phép bạn lưu tham chiếu đến các đối tượng phương tiện và khôi phục chúng sau khi khởi động lại ứng dụng mà không cần truy vấn lại.

Cách PhotoKit hoạt động: mô hình dữ liệu và truy vấn

PhotoKit được xây dựng trên ba cấp độ: mô hình dữ liệu (PHObject), truy vấn (PHFetchResult) và thay đổi (PHPhotoLibrary.performChanges). Mô hình dữ liệu có thứ bậc: PHAsset (ảnh/video) nằm trong PHAssetCollection (album) và các album được nhóm trong PHCollectionList (thư mục).

Thực hiện truy vấn

Các truy vấn được thực hiện qua PHAsset.fetchAssetsPHAssetCollection.fetchAssetCollections. Tất cả các phương thức fetch đều đồng bộ và trả về PHFetchResult, nó thực hiện ngay lập tức truy vấn vào cơ sở dữ liệu thư viện phương tiện. PHFetchResult hỗ trợ truy cập nhanh theo chỉ mục (object(at:)) và liệt kê qua enumerateObjects.

  • fetchAssets(with:options:) — truy vấn tất cả phương tiện được lọc theo loại, ngày, album
  • fetchAssetCollections(with:subtype:options:) — truy vấn album và thư mục
  • fetchAssets(in:options:) — truy vấn phương tiện trong một album cụ thể

PHFetchOptions

PHFetchOptions là đối tượng để cấu hình truy vấn: sắp xếp (sortDescriptors), vị từ (predicate), bao gồm phương tiện ẩn và đã xóa (includeHiddenAssets, includeAllBurstAssets). Các tùy chọn fetch cho phép lọc theo loại phương tiện: PHAssetMediaType.image, .video, .audio.

Các lớp chính của PhotoKit

PhotoKit bao gồm một tập hợp các lớp để truy cập, truy vấn và sửa đổi thư viện phương tiện. Hiểu từng lớp là điều cần thiết để làm việc hiệu quả với framework.

PHAsset

PHAsset là một đối tượng bất biến đại diện cho một mục phương tiện. Nó chứa siêu dữ liệu: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (cho video), isFavorite, burstIdentifier. LocalIdentifier là khóa chuỗi ổn định có thể truy cập ngay cả sau khi khởi động lại ứng dụng.

PHAssetCollection

PHAssetCollection là một nhóm phương tiện: album hệ thống (Recents, Favorites, Selfies, Screenshots), album người dùng hoặc Moments (được nhóm tự động theo thời gian và địa điểm). Thuộc tính: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.

PHCollectionList

PHCollectionList là một thư mục chứa các album (PHAssetCollection) hoặc các thư mục khác. Nó ít khi được sử dụng, chủ yếu để hiển thị hệ thống phân cấp trong giao diện người dùng.

PHImageManager và bộ nhớ đệm

PhotoKit không trả về UIImage trực tiếp từ PHAsset — bạn cần yêu cầu ảnh qua PHImageManager. Điều này đảm bảo ảnh được tải với hỗ trợ iCloud, bộ nhớ đệm và kích thước cần thiết.

Thành phầnMục đíchTính năng
PHImageManager.default()Trình quản lý tiêu chuẩn cho các yêu cầu một lầnKhông có bộ nhớ đệm giữa các yêu cầu
PHCachingImageManagerTrình quản lý với tải trước cho bộ sưu tậpstartCachingImages để cuộn mượt
PHImageRequestOptionsCài đặt yêu cầu: kích thước, chế độ, phân phốisynchronous, deliveryMode, progressHandler
PHImageRequestIDĐịnh danh yêu cầu để hủycancelImageRequest(PHImageRequestID)

PHImageManager hỗ trợ ba chế độ phân phối: opportunistic (đầu tiên là phiên bản thu nhỏ, sau đó là đầy đủ), highQualityFormat (chỉ chất lượng đầy đủ) và fastFormat (phiên bản nhanh nhất có sẵn). Đối với bộ sưu tập, luôn sử dụng PHCachingImageManager với tải trước ảnh cho các ô hiện thị.

Ví dụ sử dụng PhotoKit trong Swift

PhotoKit được sử dụng để tạo các thư viện ảnh tùy chỉnh, trình chỉnh sửa và ứng dụng phương tiện. Hãy xem xét ba kịch bản chính.

Lấy tất cả ảnh từ thư viện phương tiện

PHAsset.fetchAssets với PHFetchOptions được sắp xếp theo ngày tạo là truy vấn cơ bản để xây dựng thư viện ảnh tùy chỉnh. PHFetchResult hỗ trợ tải chậm và truy cập trực tuyến.

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("Đã tìm thấy \(allPhotos.count) ảnh")

allPhotos.enumerateObjects { asset, index, stop in
    print("Ảnh \(index): \(asset.localIdentifier)")
}

PHFetchResult là vùng chứa an toàn luồng. Truy cập các đối tượng theo chỉ mục qua object(at:) không chặn giao diện người dùng, nhưng yêu cầu ảnh qua PHImageManager phải được thực hiện không đồng bộ.

Tải ảnh với bộ nhớ đệm

PHCachingImageManager là một lớp con của PHImageManager với các phương thức startCachingImages và stopCachingImages để tải trước. Nó được sử dụng trong UICollectionView để cuộn mượt.

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

// Tải trước cho các ô hiện thị
cachingManager.startCachingImages(
    for: visibleAssets,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: nil
)

// Yêu cầu ảnh qua PHImageRequestOptions với dự phòng iCloud
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
    DispatchQueue.main.async {
        print("Đang tải xuống từ iCloud: \(progress * 100)%")
    }
}

let requestID = cachingManager.requestImage(
    for: asset,
    targetSize: targetSize,
    contentMode: .aspectFill,
    options: requestOptions
) { image, info in
    print("Đã lấy được ảnh: \(image?.size ?? .zero)")
}

Chỉnh sửa thư viện phương tiện: thêm yêu thích

Các thay đổi trong thư viện phương tiện được thực hiện qua PHPhotoLibrary.shared().performChanges bên trong khối changeRequest. Tất cả các thao tác được xử lý hàng loạt và áp dụng theo giao dịch.

swift
PHPhotoLibrary.shared().performChanges {
    let changeRequest = PHAssetChangeRequest(for: asset)
    changeRequest.isFavorite = .true
} completionHandler: { success, error in
    if success {
        print("Đã thêm vào yêu thích")
    }
}

Thay đổi và quan sát qua Change Tracking

PhotoKit cung cấp cơ chế quan sát các thay đổi trong thư viện phương tiện thông qua giao thức PHPhotoLibraryChangeObserver. Khi có bất kỳ thay đổi nào (tạo, xóa, chỉnh sửa), phương thức photoLibraryDidChange được gọi với một đối tượng PHChange.

PHChange chứa changeDetails cho mỗi loại truy vấn: PHFetchResultChangeDetails với removedIndexes, insertedIndexes, changedIndexes. Điều này cho phép áp dụng các thay đổi vào giao diện người dùng với hoạt ảnh: performBatchUpdates với move, insert, delete cho UICollectionView.

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
            // Áp dụng các thay đổi cho collectionView
        }
    }
}

Chỉnh sửa RAW và tiện ích mở rộng

PhotoKit hỗ trợ chỉnh sửa phương tiện thông qua cơ chế PHContentEditingInputPHContentEditingOutput. Ứng dụng yêu cầu editingInput với dữ liệu gốc, áp dụng các thay đổi và lưu kết quả qua editingOutput. Framework tự động giữ lại bản gốc, cho phép người dùng hoàn tác các thay đổi bằng cách đặt lại về bản gốc.

Ảnh RAW (DNG, CR2, NEF) được hỗ trợ qua PHAssetResourceManager, cung cấp quyền truy cập vào tệp RAW gốc. Để xử lý RAW, bạn nên sử dụng CoreImage với bộ lọc CIRAWFilter, hỗ trợ điều chỉnh nhiệt độ, độ phơi sáng và độ sắc nét. PhotoKit cũng hỗ trợ các tiện ích mở rộng trình chỉnh sửa qua Photo Editing Extension (iOS) — một ứng dụng có thể được gọi từ trình chỉnh sửa hệ thống để xử lý ảnh hoặc video được chọn.

Tối ưu hiệu suất PhotoKit

PhotoKit là một framework mạnh mẽ nhưng tốn nhiều tài nguyên. Sử dụng không đúng cách có thể dẫn đến độ trễ khi cuộn và tiêu thụ bộ nhớ quá mức. Hãy làm theo các khuyến nghị sau để có hiệu suất tối ưu.

  • Sử dụng PHCachingImageManager cho bộ sưu tập — tải trước ảnh cho các ô hiện thị +/-1 màn hình loại bỏ độ trễ khi cuộn
  • Đặt targetSize — không bao giờ yêu cầu PHImageManagerMaximumSize cho hình thu nhỏ. Sử dụng kích thước bằng kích thước vật lý của ô nhân với tỷ lệ màn hình
  • Hủy yêu cầu khi tái sử dụng ô — lưu PHImageRequestID và gọi cancelImageRequest trong prepareForReuse
  • Giới hạn yêu cầu iCloud — trong khi cuộn nhanh, đặt isNetworkAccessAllowed = false và chỉ tải ảnh iCloud khi dừng
  • Lưu PHFetchResult vào bộ nhớ đệm — fetchAssets lặp đi lặp lại với cùng các tùy chọn trả về PHFetchResult mới. Lưu kết quả dưới dạng thuộc tính và cập nhật qua Change Observer

PHLivePhoto yêu cầu một yêu cầu riêng qua PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:). Không yêu cầu Live Photo cho các ô chỉ hiển thị ảnh — sử dụng PHLivePhotoBadge làm chỉ báo.

Câu hỏi thường gặp

PhotoKit là gì và nó khác AssetsLibrary như thế nào?

PhotoKit là framework hiện đại của Apple để làm việc với thư viện phương tiện, được giới thiệu trong iOS 8. Không giống AssetsLibrary cũ, PhotoKit cung cấp mô hình đối tượng PHAsset, PHFetchResult với tìm kiếm nhanh, hỗ trợ iCloud và Change Tracking để quan sát các thay đổi.

Làm thế nào để yêu cầu quyền truy cập thư viện phương tiện qua PhotoKit?

Gọi PHPhotoLibrary.requestAuthorization(for: .readWrite) với một trình xử lý callback. Sau khi nhận được trạng thái .authorized, bạn có thể thực hiện các truy vấn PHAsset.fetchAssets. Quyền truy cập ghi yêu cầu quyền .readWrite. Chỉ đọc — .addOnly.

Làm thế nào để lấy ảnh từ PHAsset?

Sử dụng PHImageManager.default().requestImage với các tham số: asset, targetSize, contentMode và PHImageRequestOptions. Phương thức không đồng bộ trả về PHImageRequestID, cho phép bạn hủy yêu cầu. Đối với bộ sưu tập, hãy sử dụng PHCachingImageManager với tải trước.

Làm thế nào để theo dõi các thay đổi trong thư viện phương tiện?

Đăng ký một người quan sát qua PHPhotoLibrary.shared().register(self) và triển khai giao thức PHPhotoLibraryChangeObserver. Trong phương thức photoLibraryDidChange, nhận PHChange với changeDetails cho mỗi fetchResult và áp dụng các thay đổi vào giao diện người dùng với hoạt ảnh.

Làm thế nào để xử lý ảnh iCloud trong PhotoKit?

Trong PHImageRequestOptions, đặt isNetworkAccessAllowed = true và progressHandler để theo dõi tiến trình tải xuống iCloud. Trong khi cuộn nhanh, tắt quyền truy cập mạng và chỉ tải các phiên bản cục bộ để tránh độ trễ khi cuộn.

Tóm tắt

  • PhotoKit là framework của Apple để làm việc với thư viện phương tiện, thay thế AssetsLibrary từ iOS 8 và macOS 10.11.
  • PHAsset là mô hình dữ liệu cốt lõi với định danh cục bộ, loại, ngày, vị trí và kích thước.
  • PHFetchResult thực hiện các truy vấn đồng bộ vào bộ lưu trữ và cung cấp quyền truy cập an toàn luồng vào kết quả.
  • PHCachingImageManager với tải trước đảm bảo cuộn mượt trong bộ sưu tập mà không bị trễ.
  • Change Tracking qua PHPhotoLibraryChangeObserver cho phép giao diện người dùng phản ứng ngay lập tức với các thay đổi trong thư viện phương tiện.
  • Đồng bộ iCloud được tích hợp trong framework: yêu cầu ảnh sẽ tự động tải xuống từ iCloud với tiến trình.
  • Tối ưu — targetSize phù hợp, hủy yêu cầu và giới hạn iCloud khi cuộn là rất quan trọng đối với hiệu suất.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm