Где внутри viewDidLoad лучше всего использовать self.table.reloadData()?

#ios #arrays #swift #firebase #firebase-realtime-database

#iOS #массивы #swift #firebase #firebase-realtime-database

Вопрос:

У меня возникла проблема при сборке с помощью TestFlight, но не с помощью симулятора — иногда, когда я открываю домашнюю страницу, ничего не происходит, пока я не прокручиваю экран. Это наводит меня на мысль, что, возможно, было бы лучше перезагрузить данные где-нибудь в другом месте (где-нибудь попроще), чтобы этого не произошло. Ниже показано, где я сейчас перезагружаюсь

/////// ЧАСТЬ A

  public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ViewControllerTableViewCell
    
    let immy = cell.viewWithTag(1) as! UIImageView
    
    
    
    let person: Userx = people[indexPath.row]
    
    let like = cell.viewWithTag(3) as! UIButton
    
    
    cell.lblName.text = person.Education
    
    cell.postID = self.people[indexPath.row].postID
    
    
    if let PhotoPosts = person.PhotoPosts {
        let url = URL(string: PhotoPosts)
        print(PhotoPosts, "sttdb")
        immy.sd_setImage(with: url)
        
        
    }
    
    
    return cell
    
    
    
}

 
  

//////Часть B

    override func viewDidLoad() {
    super.viewDidLoad()

    table.dataSource = self
    table.delegate = self

        
    let thisUsersUid = Auth.auth().currentUser?.uid 
    
    refArtists = Database.database().reference().child("people");
    
    refArtists.observe(DataEventType.value,  with: { [weak self]snapshot in
        guard let self = self else { return }

        
        if snapshot.childrenCount>0{
            
            self.people.removeAll()
            
            for people in snapshot.children.allObjects as! [DataSnapshot] {
                

                if people.key != thisUsersUid {
                    print("peoplekey",people.key)

                    let peopleObject = people.value as? [String: AnyObject]
                    let peopleEducation = peopleObject?["Education"] as? String
                    .............

                    .............


                    if Calendar.current.isDateInToday(date) {
                        
                        .......

                        if self.array1.contains(people.key){
                            print(self.array1, "f111111")
                            
                            let peopl = Userx(Education: peopleEducation........)
                            
                            self.people.append(peopl)
                            
                        } else {
                            print ("w")
                        }
                    } else {
                        print ("alpha")
                        
                    }
                    

                }
                
                self.people.sort { ($0.distance ?? 0) < ($1.distance ?? 0) }
                self.table.reloadData()


                
                print("aaaaaaaa", self.people.map {$0.distance})
                
                
            }

        }
        

        
    }
  

Комментарии:

1. Очевидно, что то, что вы показываете, { [weak self]snapshot in находясь в глуши, является бессмыслицей. Не могли бы вы, пожалуйста, показать свой реальный код? Это действительно помогло бы нам помочь вам. Просто скопируйте и вставьте свой фактический код прямо в вопрос. Спасибо!

2. Я скопировал и вставил, но эта строка ошибочно не начиналась с самого начала. Мой плохой. Я исправил это сейчас. Пробелы, которые я помещаю .... , также содержат код, но это сделало бы его излишне длинным для чтения всеми вами.

3. Хорошо, хорошо, если вы уверены, что это ваш реальный код, вы вызываете reloadData() каждый раз через for people in цикл, что неэффективно. Вы должны использовать DispatchGroup, чтобы вызывать reloadData() один раз после завершения всех итераций цикла. Однако я все еще сомневаюсь, что это ваш реальный код. Я ценю .... , но давайте не будем делать предположений о том, что можно безопасно исключить из рассмотрения.

4. существует ли какой-либо код реализации вашего шаблона проектирования observer / observable. Ваш наблюдатель начнет наблюдение после загрузки представления, поэтому, я думаю, нет начального reloadData() , и поэтому он работает только после любых изменений наблюдаемого объекта. Что еще хуже, когда используемым наблюдаемым объектом является сам tableview, прокрутка или подобное вызовет перезагрузку.

5. @Ol Sen почему это определенно хуже, если для функциональности необходимы периодические перезагрузки? Каким тогда должен быть наблюдаемый объект вместо tableview? Есть переопределения: didSelectRowAt , heightForRowAt , numberOfRowsInSection . У них нет realodData()