Lazy Loading Data in iOS Carplay

后端 未结 3 1434
无人共我
无人共我 2020-12-10 08:27

How to lazy load the items while the user scrolling in Carplay ?

I am using beginLoadingChildItems from MPPlayableContentDataSource to load the first set of items bu

3条回答
  •  抹茶落季
    2020-12-10 09:11

    The way you can achieve this is inside the following function:

    func beginLoadingChildItems(at indexPath: IndexPath, completionHandler: @escaping (Error?) -> Void)
    

    As Example:

    if (indexPath[componentIndex] + 1) % Threshold == 0 { // Threshold is Your Defined Batch Size
    
        // Load the next corresponding batch 
    
    }
    

    Load your lazy data, then call:

    completionHandler(nil) // In case of no error has occurred
    

    ,but firstly, you need to return the total items count correctly in the following function:

    func numberOfChildItems(at indexPath: IndexPath) -> Int
    

    Something like the below,

    class YourDataSource : MPPlayableContentDataSource {
    
        private var items = [MPContentItem]()
        private var currentBatch = 0
    
        func beginLoadingChildItems(at indexPath: IndexPath, completionHandler: @escaping (Error?) -> Void) {
    
            // indexPath[1]: is current list level, as per CarPlay list indexing (It's an array of the indices as ex: indexPath = [0,1] means Index 0 in the first level and index 1 at the second level).
            // % 8: Means each 8 items, I will perform the corresponding action.
           // currentBatch + 1 == nextBatch, This check in order to ensure that you load the batches in their sequences.
    
            let currentCount = indexPath[1] + 1
    
            let nextBatch = (currentCount / 8) + 1
    
            if currentCount % 8 == 0 && currentBatch + 1 == nextBatch { 
    
                // Load the next corresponding batch 
                YourAPIHandler.asyncCall { newItems in
    
                    self.currentBatch = self.currentBatch + 1
    
                    items.append(newItems)
    
                    completionHandler(nil)
    
                    MPPlayableContentManager.shared().reloadData()
    
                }
    
            } else {
    
                completionHandler(nil)
    
            }
    
    
        }
    
    }
    
    func numberOfChildItems(at indexPath: IndexPath) -> Int {
    
        return self.items.count
    
    }
    

提交回复
热议问题