分配值后,可选的仍然返回Nil

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

我正在使用与'喜欢/不喜欢帖子'类似的功能。

我有MVVM体系结构;

struct MyStructModel {
    var isLiked: Bool? = false
}

class MyStructView {
    var isLiked: Bool

    init(myStructModel: MyStructModel) {
        self.isLiked = myStructModel.isLiked ?? false
    }
}

我在这里成功获得了该帖子是否被喜欢的值;

    func isPostLiked(documentID: String, completion: @escaping (Bool) -> Void) {
    guard let authID = auth.id else { return }
    let query = reference(to: .users).document(authID).collection("liked").document(documentID)
    query.getDocument { (snapshot, error) in
        if error != nil {
            print(error as Any)
            return
        }
        guard let data = snapshot?.data() else { return }
        if let value = data["isLiked"] as? Bool {
            completion(value)
        } else {
            completion(false)
        }
    }
}

func retrieveReviews(completion: @escaping([MyStructModel]) -> ()) {
    var posts = [MyStructModel]()
    let query = reference(to: .posts).order(by: "createdAt", descending: true)
    query.getDocuments { (snapshot, error) in
        if error != nil {
            print(error as Any)
            return
        }
        guard let snapshotDocuments = snapshot?.documents else { return }
        for document in snapshotDocuments {
            if var post = try? JSONDecoder().decodeQuery(MyStructModel.self, fromJSONObject: document.decode()) {
                // isLiked is nil here...
                self.isPostLiked(documentID: post.documentID!) { (isLiked) in
                    post.isLiked = isLiked
                    print("MODEL SAYS: \(post.isLiked!)")
                    // isLiked is correct value here...
                }
                posts.append(post)
            }
            completion(posts)
        }
    }
}

但是,当到达我的单元格时,该值仍然为零。

添加单元格代码:

var post: MyStructView? {
        didSet {
            guard let post = post else { return }
            print(post.isLiked!)
        }
    }
ios swift optional optional-arguments swift-optionals
1个回答
0
投票

您的isLiked属性在单元格中可能为零,因为retrieveReviews函数在完成自身之前不会等待isPostLiked函数完成。

您可以使用DispatchGroups轻松解决此问题。这将使您能够确保在插入数组之前,已正确设置所有帖子的isLiked值,然后只需使用DispatchGroup的notify块即可通过完成处理程序返回所有已加载的帖子:

func retrieveReviews(completion: @escaping([MyStructModel]) -> ()) {
    var posts = [MyStructModel]()
    let query = reference(to: .posts).order(by: "createdAt", descending: true)
    query.getDocuments { [weak self] (snapshot, error) in
        guard let self = self else { return }
        if error != nil {
            return
        }
        guard let documents = snapshot?.documents else { return }
        let dispatchGroup = DispatchGroup()
        for document in documents {
            dispatchGroup.enter()
            if var post = try? JSONDecoder().decodeQuery(MyStructModel.self, fromJSONObject: document.decode()) {
                self.isPostLiked(documentID: post.documentID!) { isLiked in
                    post.isLiked = isLiked
                    posts.append(post)
                    dispatchGroup.leave()
                }
            }
            dispatchGroup.notify(queue: .main) {
                completion(posts)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.