2016-07-09 70 views
1

我正在處理一個問題。我正在Parse的一個表上進行查詢(在一個函數內),並且我得到了一些objectids。我把它們推到一個數組中。Swift 2函數完成

在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包含在所述的ObjectID的陣列內,然後改變從按鈕的背景我檢查不喜歡喜歡。 都好到現在,但我也有一個刷新功能是類似的東西

@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

非常感謝!

回答

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 
    } 

} 
+0

當我嘗試插入'完成(.Success())''我成功queryLikes'裏面給我的錯誤'無法調用非功能型的值「結果」(又名「結果<()>」 )'我已經把'enum'放在進口的下面了..我錯過了什麼嗎?你想讓我用完整的功能更新問題嗎? –

+1

現在我完全理解什麼是以一種開始的方式完成。非常感謝Diogo!像一個魅力也工作:D –

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) 
       } 
      } 
     } 
+1

兩個答案都是正確的,都工作!但我接受了diogo的回答,因爲他先回答了。非常感謝您的幫助:D –

+1

@KwnstantinosNatsios沒有問題,他的回答是首選方式。 –