【问题标题】:Loop is taking too long to process循环处理时间过长
【发布时间】:2018-03-15 12:38:11
【问题描述】:

我正在使用以下代码将联系人数组排列在部分中(例如,前缀为“A”的联系人应显示在“A”部分下)。如果有 4-5 百个联系人,则处理需要 20 秒。

你能检查一下这里有什么问题吗?或任何替代品。

 let finalArr = NSMutableArray()

    for contactDetail in conatctsArr {

        let name = (contactDetail as! Dictionary)["givenName"] ?? ""// Getting First character of name
        var key = String()
        if name.characters.count > 0 {
            let index1 = name.index((name.startIndex), offsetBy: 1)
            key = name.substring(to: index1)
        }
        else {
            key = ""
        }

        // getting all contatcts starting with particular character
        let predicate=NSPredicate(format: "SELF.givenName beginswith[c] %@",key)

        let filteredArr = (conatctsArr as NSArray).filtered(using: predicate)

        var dic = Dictionary<String, Any>()
        dic["key"] = key
        dic["values"] = filteredArr

        if filteredArr.count > 0  && !(finalArr.contains(dic)) {
            finalArr.add(dic)
        }
    }

【问题讨论】:

    标签: ios swift xcode performance memory


    【解决方案1】:

    在每个循环中处理后从数组中删除过滤后的元素可能会提高性能。试试:

        let finalArr = NSMutableArray()
        var processingArray = NSMutableArray(array:conatctsArr)
    
        while processingArray.count > 0 {
            let contactDetail = processingArray[0]
            let name = (contactDetail as! Dictionary)["givenName"] ?? ""
            var key = String()
            if name.characters.count > 0 {
                let index1 = name.index((name.startIndex), offsetBy: 1)
                key = name.substring(to: index1)
            }
            else {
                key = ""
            }
    
            let predicate=NSPredicate(format: "SELF.givenName beginswith[c] %@",key)
            let filteredArr = processingArray.filtered(using: predicate)
    
            if filteredArr.count > 0 {
                var dic = Dictionary<String, Any>()
                dic["key"] = key
                dic["values"] = filteredArr
                finalArr.add(dic)
            }
    
            processingArray.removeObjects(in: filteredArr)
        }
    

    【讨论】:

      【解决方案2】:

      在您的代码中,对同一个键进行了多次过滤。试试看:

      let finalArr = NSMutableArray()
          for contactDetail in conatctsArr 
      {
          let keysArray = [“A”, “B”, “C”,…. “Z”]
          for key in keysArray
          {
              let predicate=NSPredicate(format: "SELF.givenName beginswith[c] %@",key)
              let filteredArr = (conatctsArr as NSArray).filtered(using: predicate)
              var dic = Dictionary<String, Any>()
              dic["key"] = key
              dic["values"] = filteredArr
              if filteredArr.count > 0) {
                  finalArr.add(dic)
                  }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        相关资源
        最近更新 更多