我有一个数组,其中包含我从Firebase这样获得的数据:
profileImage = UIImage(data: data!)!
array.append(CustomModel(creatorID:creatorID, creatorPhoto: profileImage, creatorName: creatorName, documentID: documentID))
现在我需要将该数组附加到另一个这样的数组中
self.arrayOfArrays.append(array)
但是,当我附加array
时,它似乎保留为空,因为(我猜)图像仍在加载到array
上。
我的问题是:我可以使用某种调度或延迟的方法来等待array
完成加载,然后再将其附加到arrayOfArrays
吗?
PS:我尝试使用DispatchQueue.main.asyncAfter(deadline: .now() + 5)
,它可以工作,但是我需要的不是基于时间的内容。
而且我也不能在代码的正下方:
array.append(CustomModel(creatorID:creatorID, creatorPhoto: profileImage, creatorName: creatorName, documentID: documentID))
因为这会破坏代码的结构。
为什么不通过RxSwift和RxCocoa使用反应性方法。您可以通过以下方式实现:
假设这是您的可编码结构:
struct CustomModel: Codable {
let creatorID: String
let creatorPhoto: Data
let creatorName: String
let documentID: String
}
接下来创建您的firebase客户端,该客户端将创建可观察的内容以从firebase数据库中获取CustomModel
class FirebaseClient {
static var shared = FirebaseClient()
lazy var firebaseRequestObservable = FirebaseRequestObservable()
func getCustomModel() throws -> Observable<CustomModel> {
return requestObservable.getCustomModel()
}
}
接下来,您必须使用getCustomModel
方法实现您的可观察对象,该方法将从firebase返回您的CustomModel
。我已将子名称设置为CustomModel
,但您可以根据自己的Firebase结构进行设置。同样在这里,您可以返回数据数组,例如[CustomModel]
。此外,我们添加了onNext
,onError
和onCompleted
方法,这些方法将返回数据或错误或完成对observable的订阅。
public class FirebaseRequestObservable {
let citiesRef = db.collection("CustomModels")
public init() {
}
//MARK: function for URLSession takes
public func getCustomModel<CustomModel: Decodable>() -> Observable<CustomModel> {
//MARK: creating our observable
return Observable.create { observer in
Database.database().reference().child("CustomModel").observeSingleEvent(of: .value, with: { (snapshot) in
guard let value = snapshot.value else { return }
do {
let customModel = try FirebaseDecoder().decode(CustomModel.self, from: value)
observer.onNext(customModel)
} catch let error {
observer.onError(error)
}
//MARK: observer onCompleted event
observer.onCompleted()
})
return Disposables.create {
task.cancel()
}
}
}
}
最后在您的ViewController
中从客户端类调用客户端getCustomModel
方法,该方法将异步返回您的数据。
class ViewController: UIViewController {
var customModel: CustomModel
var array: [CustomModel] = []
var arrayOfArrays: [[CustomModel]] = []
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let client = FirebaseClient.shared
do{
try client.getCustomModel().subscribe(
onNext: { result in
//result is custom model from firebase
self.customModel = result
//append your data
self.array.append(self.customModel)
self.arrayOfArrays.append(array)
},
onError: { error in
print(error.localizedDescription)
},
onCompleted: {
print("Completed event.")
}).disposed(by: disposeBag)
}
catch{
}
}
}