美文网首页
关于一段案例的业务逻辑整理

关于一段案例的业务逻辑整理

作者: 古草犹香 | 来源:发表于2019-10-30 11:56 被阅读0次
1.jpg
单一类型选择,只能选择图片或视频
2.jpg
多类型选择,可同时选择图片和视频(例如抖音、ins可以图片和视频拼合)
3.jpg
记录逻辑复杂的情景启发(这段代码可以换种写法,且不论)
    
    private func _remove(itemModel: KSMediaPickerItemModel) -> UInt {
        let selectedAssetArray = _selectedAssetArray
        let index = selectedAssetArray.index(of: itemModel) // 0 - 8
        let count = selectedAssetArray.count  // 1 - 9
        
        // 元素不在选择池直接返回
        guard index >= 0, index < count else {
            return 0
        }
        // 重置元素index,从选择池中删除元素
        itemModel.index = 0
        selectedAssetArray.removeObject(at: index)
        
        let view = self.view as! KSMediaPickerView
        // 媒体类型
        let assetMediaType = itemModel.asset.mediaType
        // 选择上限数
        var k_maxItemCount = maxItemCount
        var needUpdateSingleType = false
        let isSingleType = _currentSingleType != nil
        if isSingleType {
            if _currentSingleType! == .video {
                k_maxItemCount = maxVideoItemCount
            } else if _currentSingleType! == .picture {
                k_maxItemCount = maxPictureItemCount
            }
            needUpdateSingleType = count == 1
        }
        let needUpdateIndexNumber = index != count-1   // 不是序号最大的那一个
        let needUpdateFocus = count == k_maxItemCount  // 池满
        
        // 不是序号最大的那个,而且选择池满的时候 需要更新label num。
       //多类型选择的情况下:不在选择池的元素都去遮罩;
       //而单类型:同类型的不在选择池的都去遮罩,异己类型不去遮罩层
        if needUpdateIndexNumber && needUpdateFocus {
            let assetList = _selectedAlbum!.assetList
            var j = Int(1)
            for k_itemModel in assetList {
                if selectedAssetArray.contains(k_itemModel) {
                    k_itemModel.index = UInt(j)  //更新num
                    j += 1
                    print("1111111111")
                } else {
                    print("22222222222") 
                    // 不在选择池的元素, 单一选择的话,和当前元素类型相同的话,
                    // 而且有遮罩层的元素,则隐藏遮罩层
                    // 多类型选择的情况下:有遮罩的元素都去遮罩
                    let ok = isSingleType ? (assetMediaType == k_itemModel.asset.mediaType) : true
                    // 选择池满,但就一个元素
                    // needUpdateSingleType 不是索引最大的那个而且满额的情况下,
// needUpdateSingleType = count == 1 永远为假
                    if (needUpdateSingleType || (ok && k_itemModel.isLoseFocus)) {
                        print("333333333333")
                        k_itemModel.isLoseFocus = false 
 // 这里隐藏遮罩层,叫失去焦点,没有遮罩层才可点击操作,叫获得焦点,才对
                        break
                    }
                }
            }
            let collectionView = view.collectionView
            collectionView.reloadData()
            // 不是序号最大的那个,选择池没满,要更新label num 
//(单类型选择无需考虑不同类型遮罩层的隐藏,多类型无遮罩层)
        } else if needUpdateIndexNumber {
            let assetList = _selectedAlbum!.assetList as NSArray
            let assetListCount = assetList.count
            var indexPaths = Array<IndexPath>()
            for (i, k_itemModel) in selectedAssetArray.enumerated() {
                let l_itemModel = k_itemModel as! KSMediaPickerItemModel
                l_itemModel.index = UInt(i+1) // 更新num
                let k_index = assetList.index(of: l_itemModel)
                if k_index >= 0 && k_index < assetListCount {
                    let indexPath = IndexPath(item: k_index, section: 0)
                    indexPaths.append(indexPath)
                }
            }
            let collectionView = view.collectionView
            collectionView.performBatchUpdates({
                collectionView.reloadItems(at: indexPaths)
            }, completion: nil)
        } else {
            // 当前元素是序号最大的元素
            let collectionView = view.collectionView
            let assetList = _selectedAlbum!.assetList
            // (找临界值)单一类型选择而且池中就一个元素,要对不同媒体类型元素去除遮罩层(复位)
            if needUpdateSingleType {
                for k_itemModel in assetList {
                    k_itemModel.isLoseFocus = false  // 所有遮罩层都隐藏,即复位
                }
                collectionView.reloadData()
                // (找临界值)池满
            } else if needUpdateFocus {
                var indexPaths = Array<IndexPath>()
                for (i, k_itemModel) in assetList.enumerated() {
                    // 单一类型选择的同媒体类型或者非单一
                    let ok = isSingleType ? (assetMediaType == k_itemModel.asset.mediaType) : true
                    // 有遮罩层的
                    if (ok && k_itemModel.isLoseFocus) {
                        k_itemModel.isLoseFocus = false  // 隐藏遮罩层
                        let indexPath = IndexPath(item: i, section: 0)
                        indexPaths.append(indexPath)
                    }
                }
                collectionView.performBatchUpdates({
                    collectionView.reloadItems(at: indexPaths)
                }, completion: nil)
            }
        }
        let albumNavigationView = view.albumNavigationView
        albumNavigationView.centerButton.isEnabled = true
        albumNavigationView.nextButton.isEnabled = selectedAssetArray.count > 0
        return 0
    }

相关文章

  • 关于一段案例的业务逻辑整理

    单一类型选择,只能选择图片或视频 多类型选择,可同时选择图片和视频(例如抖音、ins可以图片和视频拼合) 记录逻辑...

  • 爱家(租房系统)---- 发布房源信息

    关于用户的相关业务逻辑已经基本完成,接下来是关于房屋的业务逻辑。所以此时就需要在项目中的app文件中创建house...

  • Android-MVP模式简单小案例

    MVP模式的登录小案例; MVP模式的核心思想 把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成...

  • 业务流程图的绘制

    业务流程图的绘制 产品经理业务流程图的绘制流程分享 近来一段时间,忙于整理业务流程图,期间,关于流程图的绘制方法和...

  • 关于「注册-登录」的业务逻辑

    今天总结一下APP交互设计中注册-登录页面的业务逻辑。 「功能内容根据业务逻辑来进行特定选择」 1.什么样的APP...

  • 后端产品经理

    定义 业务、逻辑、跨越、结构、控制、数据 后端产品经理 是整个后端业务需求的整理者,需要串起整个业务的前中后所有流...

  • 【案例】宝藏App“学习强国”的业务逻辑

    2019年初,“学习强国App”制霸应用商场下载排行榜,当时给人的使用感觉是钉钉和新闻资讯的结合体。实话说,从产品...

  • 一个基于IJKPlayer媒体播放器的扩展库

    由于公司业务用到了音频播放,于是就有了这个这篇文章。本文的主旨在于整理开发的逻辑思路,整理了逻辑图和功能图解。 项...

  • 了解Magento的相关知识

    控制器是Magento所有业务逻辑的起点。 业务逻辑是指业务理论中的规则。至于 Magento业务逻辑和域逻辑(数...

  • 数据运营逻辑

    明确业务目标,梳理清晰业务逻辑,收集整理数据,界定关键数据,分析数据找出问题,针对问题输出解决方案

网友评论

      本文标题:关于一段案例的业务逻辑整理

      本文链接:https://www.haomeiwen.com/subject/tidovctx.html