【问题标题】:Optional Still Returning Nil After Assigning ValueOptional 在赋值后仍然返回 Nil
【发布时间】:2020-09-24 09:16:28
【问题描述】:

我正在开发与“喜欢/不喜欢帖子”类似的功能。

我有一个 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!)
        }
    }

【问题讨论】:

  • 你能把你的手机密码贴出来吗?
  • 任务是异步的吗?如果是这样,您应该在更新后附加帖子。
  • 我相信是的。如果我将 posts.append(post) 移到 isPostLiked 补全中,我将无法取回帖子。
  • retrieveReviews 的完成处理程序很可能在 isPostLiked 的完成处理程序之前被调用,因此 isLiked 没有设置。
  • @JoakimDanielson 是的,我相信你是对的。在 isPostLiked 调用之前,我已经打印了获取帖子及其调用的完成。有什么想法可以解决这个问题吗?

标签: ios swift optional optional-arguments swift-optionals


【解决方案1】:

您的单元格中的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)
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-23
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多