How can you ensure that cells are not duplicated when the device is overwhelmed by code from the previous page?

47 Views Asked by At

I have a problem that only occurs when page A has to run a massive amount of code and the user goes to page B before all the A page code is finished. In these instances, sometimes cells get duplicated(ie, say page B must be : User H in top, user F below him. Instead there are two Hs followed by two Fs below them).

Below is the relevant code of page B, but I am fairly certain the problem does not lie there. Why?: Because I changed the array that gets displayed [H,F] to a set, so according to the code, there should never be an instance like [H,H,F,F]

///Part1: code that gets called from viewdidLoad

var peppi = [Usery]()

func printPersonInfo(uid: String) {
self.handleA = thisUser.observe(DataEventType.value,  with: {  snapshot in
    ...
    myPeopleRef44.queryLimited(toLast: 30).observeSingleEvent(of: .value, with: { [self] snapshot in
        let uniqueArray = snapshot.children.allObjects as! [DataSnapshot]
        let peopleArray = Array(Set(uniqueArray))
         for person in peopleArray where uid == person.value as? String {
            ...
            func decode(autoId: String) -> TimeInterval {
            }
            return TimeInterval(exactly: timestamp)!
        }
        ...
        if Calendar.current.isDateInToday(date){
            let p = Usery(...)
            peppi.append(p)
        }
    }
        DispatchQueue.main.async {
        self.peppi.sort { ($0.self.time1 ?? 0) > ($1.self.time1 ?? 0) 
        }
        print(self.peppi, "lo")
        self.table.reloadData()
         }
    })
})
}

/// Part: 2 In viewDidLoad, code that calls the function printPersonInfo

handle = myPeopleRef.queryLimited(toLast: 30).observe(DataEventType.value,  with: {  snapshot in
 func decode(autoId: String) -> TimeInterval {
    ..
return …
 }
let uniqueArray1 = snapshot.children.allObjects as! [DataSnapshot]
let peopleArray = Array(Set(uniqueArray1))
for person4 in peopleArray where uid == Auth.auth().currentUser?.uid   {
self.dg.enter()
self.dg.leave()
 self.dg.notify(queue: .main) {
    let date = Date(timeIntervalSince1970: TimeInterval(time11)/1000.0)
    print(date,"pdate")
    if Calendar.current.isDateInToday(date){
        self.printPersonInfo(uid: personUid)
    }
 }
}
 DispatchQueue.main.asyncAfter(deadline: .now() + 4) {
let ref = Database.database().reference().child("people")
ref.removeObserver(withHandle: handle)
ref.removeObserver(withHandle: self.handleA)
 }
})
0

There are 0 best solutions below