【发布时间】:2017-06-05 23:17:53
【问题描述】:
我是异步编码的新手,我想知道我用来获取和显示数据的方法在 swift 中是否被认为是正确的。
此方法从数据库中的用户部分获取对象列表,然后为列表中的每个项目获取图片。我告诉是否所有图像都已获取的方式是在它们到达时将它们推送到一个数组,然后如果该数组的长度等于我重新加载视图的对象列表。这是我的代码:
var pets = [String]()
var imgs = [UIImage]()
override func viewDidAppear(_ animated: Bool) {
imgsLoaded = 0
imgs.removeAll(keepingCapacity: false) // Clear images array
pets.removeAll(keepingCapacity: false) // Clear list of objects
let userRef = FIRDatabase.database().reference().child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("pets")
userRef.observeSingleEvent(of: .value, with: { snapshot in // fetch list of objects from database
if (snapshot.value as? Bool) != nil { // User has no pets added
self.loadScrollView() // Reload view
} else if let snap = snapshot.value as? NSDictionary { // User has pets
for value in snap {
self.pets.append(value.key as! String) // Append object to list of objects
}
for i in 0..<self.pets.count { // For each item in the list, fetch its corresponding image
let imgRef = FIRStorage.storage().reference().child("profile_images").child(self.pets[i]+".png")
imgRef.data(withMaxSize: 15 * 1024 * 1024) { (data, error) -> Void in
if error != nil {
print(error)
}
// Create a UIImage, add it to the array
self.imgs.append(UIImage(data: data!)!) // Push image to list of images
self.imgsLoaded+=1
if self.imgsLoaded == self.pets.count { // If same number of images loaded, reload the view
self.loadScrollView()
}
}
}
}
})
}
正如我所说,我是异步编码的新手,想听听我正在尝试的正确方法。我的方法的一个问题是图像数组可能与数据数组不对齐,因为可以乱序获取图像。我很想学习最好的方法,所以请告诉我!
编辑:确保我的数据与相应图像对齐的一种方法是设置一个排序字典,其中键是数据,值是我猜的图像。
【问题讨论】:
-
如果您的图像和数据没有存储在同一条记录中,那么可以肯定的是,它们的顺序会被破坏。
标签: swift asynchronous firebase firebase-realtime-database