             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)
-                }
+            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 {

        return subtype.rawValue < PHAssetCollectionSubtype.smartAlbumGeneric.rawValue ? .album : .smartAlbum
    }
    
    open func fetchGroups(assetGroupTypes: [PHAssetCollectionSubtype], 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
                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 {

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