sajwan
sajwan

Reputation: 333

Loop is taking too long to process

I am using following to code to arrange the array of contacts in sections (for e.g. contact with prefix "A" should show under "A" section). If there are contacts 4-5 hundred then it takes 20 sec to process.

Can you please check what is issue here? or any alternate for this.

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

Upvotes: 1

Views: 291

Answers (2)

MBN
MBN

Reputation: 304

In your code, the filtering is being done multiple times for the same key. Try :

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

Upvotes: 1

Yun CHEN
Yun CHEN

Reputation: 6648

Removing the filtered elements from the array after processing in each loop might improve the performance. Try:

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

Upvotes: 1

Related Questions