等待将图像加载到一个数组之后再将该数组追加到另一个数组中

问题描述 投票:0回答:1

我有一个数组,其中包含我从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))

因为这会破坏代码的结构。

arrays swift
1个回答
1
投票

为什么不通过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]。此外,我们添加了onNextonErroronCompleted方法,这些方法将返回数据或错误或完成对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{

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.