Lazy Loading Data in iOS Carplay

白昼怎懂夜的黑 提交于 2020-01-19 16:24:10

问题


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 but how I can call the next page when a user scrolls to the bottom of the page?


回答1:


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

}



回答2:


Key here is to declare your MPContentItem as a container like this

            let item = MPContentItem(identifier: "Tab \(indexPath)")
            item.isContainer = true
            item.isPlayable = false
            return item

Then only the framework will call beginLoadingChildItems method when that item is visible on the screen.

Inside beginLoadingChildItems call the load more function and refresh the items using

playableContentManager?.reloadData()

function



来源:https://stackoverflow.com/questions/59501929/lazy-loading-data-in-ios-carplay

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!