#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()