【问题标题】:Swift - Array won't .append(data) in closureSwift - 数组不会 .append(data) 关闭
【发布时间】:2016-07-05 09:10:32
【问题描述】:

我确定我错过了一些明显的东西。

使用 Parse Server 我想将请求中的一些数据填充到字典中。

query.findObjectsInBackgroundWithBlock { (books, error) in
            guard (books != nil) else {
                print(error)
                return
            }
            for book in books! {
                print("\n\n\(book)")  //#1 Got some book

                if let coverString = book["cover"] {
                    print("coverString OK : \(coverString)") //#2 got a valid String
                    self.bookImages.append(coverString as? String)
                } else {
                    print("coverString nil")
                    self.bookImages.append(nil)
                }
            }
        }

如果我:print("Tableau image: \(bookImages)\n") 我在我的var bookImages = [String?]() 中什么也没有,即使我在coverString #2 中得到了一些东西。

但是如果我 .append("foobar") 除了在闭包中的其他任何地方(尝试),我的字典就不是空的。

为什么会有这种奇怪的魔法?

【问题讨论】:

  • findObjectsInBackgroundWithBlock 是一个异步操作。因此,您的数组(.append 用于数组,而不是字典)可能已正确填充,但您可能在未填充时查看它尚未
  • 是的,抱歉,我需要一杯咖啡,一个数组,你是对的。我也没有考虑过,但是您对异步方法可能是正确的。哼?但我不知道如何管理这个。这是我的文件的要点:gist.github.com/gfelot/70af1dd940d605b47578

标签: arrays swift append


【解决方案1】:

findObjectsInBackgroundWithBlock 是一个异步操作。

因此,您的数组(.append 用于数组,而不是字典)可能已正确填充,但您在未填充时正在查看它尚未

如果您将print 语句放入闭包中,您将看到结果。

您还应该在那里重新加载 TableView,但将其重新调度到主线程。

例子:

query.findObjectsInBackgroundWithBlock { (books, error) in
    guard (books != nil) else {
        print(error)
        return
    }
    for book in books! {

        if let coverString = book["cover"] {
            print("coverString OK : \(coverString)")
            self.bookImages.append(coverString as? String)
        } else {
            print("coverString nil")
            self.bookImages.append(nil)
        }

        if let titleString = book["title"] {
            print("titleString OK : \(titleString)")
            self.bookTitle.append(titleString as? String)
        } else {
            print("titleString nil")
            self.bookTitle.append("No Title")
        }
    }

    print("Tableau image2: \(self.bookImages)\n")
    print("Tableau title2: \(self.bookTitle)\n")

    dispatch_async(dispatch_get_main_queue()) {
        self.collectionView?.reloadData()
    }

}

【讨论】:

  • 我认为你是在正确的轨道上。但我的数组中仍然没有任何内容。
  • 这应该可以。请注意,我对您的版本进行了一些修改。您能否告诉我运行此代码时print("Tableau title2: \(self.bookTitle)\n") 的确切结果?
  • 抱歉,它正在工作。除了 dispatch_async 你改了什么?
  • 您在使用之前重新声明了collectionView。不确定这是否是一个错误,但它肯定是不必要的,所以我删除了它。 :) 无论如何,我很高兴我能提供帮助,而且它现在正在工作,很酷。
  • 谢谢美人。 Je dois aller voir la doc sur la gestion des threads ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2014-08-12
  • 1970-01-01
  • 2016-06-30
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多