         let assetGroupTypes = self.configuration.assetGroupTypes
         var insertedGroupIds: [String] = []
         
-        self.fetchGroups(assetGroupTypes: assetGroupTypes) { [weak self] collection in
+        self.fetchGroups(assetGroupTypes: assetGroupTypes, groupFetchPredicate: self.configuration.groupFetchPredicate) { [weak self] collection in
             if let groups = self?.groups,
                 groups[collection.localIdentifier] == nil,
                 let assetGroup = self?.makeDKAssetGroup(with: collection)

            var groups: [String : DKAssetGroup] = [:]
            var groupIds: [String] = []
            
            strongSelf.fetchGroups(assetGroupTypes: assetGroupTypes, block: { (collection) in
                let assetGroup = strongSelf.makeDKAssetGroup(with: collection)
                groups[assetGroup.groupId] = assetGroup
                groupIds.append(assetGroup.groupId)
                
                // Filter the reloads to avoid frequetly reloadData() calling in collectionView
                if !groupIds.isEmpty && collection.assetCollectionSubtype == .smartAlbumUserLibrary {
                    strongSelf.updatePartial(groups: groups, groupIds: groupIds, completeBlock: completeBlock)
                }
            })
            PHPhotoLibrary.shared().register(strongSelf)
            if !groupIds.isEmpty {

        return subtype.rawValue < PHAssetCollectionSubtype.smartAlbumGeneric.rawValue ? .album : .smartAlbum
    }
    
    open func fetchGroups(assetGroupTypes: [PHAssetCollectionSubtype],
                          groupFetchPredicate: NSPredicate? = nil,
                          block: @escaping (PHAssetCollection) -> Void) {
        for (_, groupType) in assetGroupTypes.enumerated() {
            let fetchResult = PHAssetCollection.fetchAssetCollections(with: self.collectionType(for: groupType),
                                                                      subtype: groupType,
                                                                      options: nil)
            fetchResult.enumerateObjects({ (collection, index, stop) in
                if let groupFetchPredicate = groupFetchPredicate {
                    if groupFetchPredicate.evaluate(with: collection) {
                        block(collection)
                    }
                } else {
                    block(collection)
                }
            })
        }
    }
    
    open func updatePartial(groups: [String : DKAssetGroup],
                            groupIds: [String],
                            completeBlock: @escaping (_ groups: [String]?, _ error: NSError?) -> Void) {
        self.groups = groups
        self.groupIds = groupIds
        DispatchQueue.main.async {
