2016-01-07 72 views
1

我正在Swift中爲我的高中運動隊開發一個應用程序。當您單擊主視圖控制器上的按鈕時,它會獲取想要查看的團隊的變量,並根據所選團隊獲取某個視頻的鏈接。當我第一次選擇團隊時會出現問題;它什麼也沒有顯示,但是當我再次點擊回家並且然後團隊時,它顯示。iOS Swift:函數沒有返回正確的值

這是我在HomeViewController按鈕代碼:

import UIKit 

class homeViewController: UIViewController { 

@IBAction func varsityBasketballBtn(sender: AnyObject) { 
    appDelegate.team = "VARSITY BASKETBALL" 
} 

@IBAction func varsityHockeyBtn(sender: AnyObject) { 
    appDelegate.team = "VARSITY HOCKEY" 
} 

@IBAction func jvBasketballBtn(sender: AnyObject) { 
    appDelegate.team = "JV BASKETBALL" 
} 

@IBAction func jvHockeyBtn(sender: AnyObject) { 
    appDelegate.team = "JV HOCKEY" 
} 

你點擊一個按鈕後,它塞格斯到tabBarController,並設置AppDelegate中的團隊變量選擇的球隊。在AppDelegate中,我創建了一個函數,它根據團隊變量從parse.com中檢索視頻的鏈接。然後,我把這個函數,它應該返回embedLink,在我的網頁視圖的HTML代碼。當我第一次加載應用程序並選擇一個團隊時,網絡視圖是空白的,但回家後重新選擇團隊,它會顯示正確的視頻。我添加打印語句到我的功能,這似乎告訴我,它返回的embedLink變量從解析這似乎是我的問題,運行我的查詢之前:

var embedLink:String = "" 

func getLink() -> String{ 

    let query = PFQuery(className:"LiveLink") 
    print("This is right after query") 
    query.findObjectsInBackgroundWithBlock{ 
     (liveLink:[PFObject]?,error: NSError?) -> Void in 
     print("This is before livelink") 

     if error == nil && liveLink != nil { 
      for link in liveLink!{ 
       if link["team"] as! String == self.team{ 
        self.embedLink = link["link"] as! String 
        print("This is link in query: \(self.embedLink)") 
       } 
      } 
     } else { 
      print(error) 
     } 
    } 
    print("This is link in func: \(embedLink)") 
    return embedLink 
} 

請告知,以你怎麼想這可能是正確完成。任何幫助表示讚賞。

回答

2

找到鏈接,你的函數在之前返回後臺任務完成並找到鏈接:self.embedLink在函數返回時未設置。

你需要通過完成處理程序作爲參數,並調用,一旦後臺任務完成(經過embedLink你剛發現):

func getLink(withCompletion completion:((link:String)-> (Void))) { 

    let query = PFQuery(className:"LiveLink") 
    print("This is right after query") 
    query.findObjectsInBackgroundWithBlock{ 
     (liveLink:[PFObject]?,error: NSError?) -> Void in 
     print("This is before livelink") 

     if error == nil && liveLink != nil { 
      for link in liveLink!{ 
       if link["team"] as! String == self.team{ 

        let embedLink = link["link"] as! String 

        // Call completion handler, 
        // passing the found link:       
        completion(link: embedLink) 
       } 
      } 
     } 
     else { 
      print(error) 
     } 
    } 
} 

因此,功能getLink()本身沒有返回值(它不能等待在後臺運行的任務);相反,當後臺任務完成時,需要一個「回調」塊來調用。

+0

非常感謝你!這固定了一切! –

0

我認爲query.findObjectsInBackgroundWithBlock{是異步的,所以embedLink在請求未完成時返回時可能爲零。因此,儘量使用封閉

func getLink(completion:(String?)->Void){ 
     if link["team"] as! String == self.team { 
      self.embedLink = link["link"] as! String 
      print("This is link in query: \(self.embedLink)") 
      completion(self.embedLink) 
     } 
    } 

    getLink { (link) -> Void in 
     ... 
     print(link!) 
     ... 
    } 

而且那麼做的請求後,以確保任何其他按鍵/動作可以活動的,因爲你使用的是異步操作可能是一個進度條是必要像MBProgressHUD

+0

從塊'findObjectsInBackgroundWithBlock'返回字符串不會從函數'getLink()'返回! –

+0

恩,是的,無視它。 :) –