         .albumRegular
     ]
     
+    /// A predicate that specifies which properties to select results by and that also specifies any constraints on selection.
+    public var groupFetchPredicate: NSPredicate? = nil
+    
     /// Options that specify a filter predicate and sort order for the fetched assets, or nil to use default options.
     @objc public var assetFetchOptions: PHFetchOptions?
     

        copy.assetGroupTypes = self.assetGroupTypes
        copy.assetFetchOptions = self.assetFetchOptions
        copy.fetchLimit = self.fetchLimit
        
        return copy
    }

            var groups: [String : DKAssetGroup] = [:]
            var groupIds: [String] = []
            
            strongSelf.fetchGroups(assetGroupTypes: assetGroupTypes,
                                   groupFetchPredicate: self?.configuration.groupFetchPredicate,
                                   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 {
