Swift 2功能完成

时间:2016-07-09 08:40:17

标签: ios swift asynchronous swift2

我在这里处理一个问题。我在Parse的一个表上进行查询(在一个函数内),我得到了一些目标。我将它们推入阵列。

在ViewDidLoad中,我有以下顺序

override func viewDidLoad() {
        super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refreshControl.addTarget(self, action: #selector(Images.refresh),   forControlEvents: UIControlEvents.ValueChanged)
    self.imagesCollView!.addSubview(refreshControl)
    queryLikes()  // it calls first the likes query
    queryImages("")  // and when the previous query has done, it should run this query.
}

并且在cellForItemAtIndexPath我正在检查图像的对象id是否包含在对象的数组中,然后将按钮的背景从unliked更改为like。 到目前为止所有的好,但我也有一个类似的刷新功能

@IBAction func refreshButt(sender: AnyObject) {
    queryLikes()  //this first call to the query of likes table
    searchBar.text = ""
    categoryStr = ""
    queryImages("")  //and when the previous query is ready, it should run this query.
}

因此,当有人使用按钮刷新视图时,它会先加载第二个查询,然后加载第一个查询。

是否有任何工作示例向我展示如何首先运行queryLikes运行以及何时运行queryImages ??

非常感谢!

2 个答案:

答案 0 :(得分:3)

您可以通过使用回调和链接请求来实现此目的:

enum Result<T> {
    case Success(T)
    case Failure(NSError)
}


func queryLikes(completion: Result<Void> -> Void) {
    if networkCallSuccess() { completion(.Success()) }
    else { completion(.Failure(.Error)) }
}

queryLikes() { result in
    switch result {
    case .Success: queryImages()
    case .Failure(let error): // Handle error
    }

}

答案 1 :(得分:2)

这是处理这种情况的一种更简单的方法。但我建议Diogo Antunes而不是这种方法的答案,如果你是初学者,你可以选择这个。

func queryLikes(completion: (success : Bool) -> ()) {
  // After putting your statements
  completion(success: true)
}

如果您正在处理函数内的任何条件,请尝试此操作。

func queryLikes(completion: (success : Bool) -> ()) {

            if condition {
                completion(success: true)
            }
            else {
                completion(success: false)
            }
        }

在函数内部使用for循环。

func queryLikes(completion: (success : Bool) -> ()) {

            let objects : [Int] = []

            for object in 0..<objects.count
            {
                if object == objects.endIndex
                {
                    completion(success: true)
                }
            }
        }