iOS Swift:函数没有返回正确的值

时间:2016-01-07 02:48:14

标签: ios swift function variables

我正在为我的高中运动队在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检索视频的链接。然后我把这个函数放在我的web视图的html代码中,它应该返回embedLink。当我第一次加载应用程序并选择一个团队时,Web视图是空白的,但在回家并重新选择团队后,它会显示正确的视频。我在我的函数中添加了print语句,这似乎告诉我它在从parse运行我的查询之前返回了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 个答案:

答案 0 :(得分: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()本身不返回值(它不能等待在后台运行的任务);相反,当后台任务完成时,它需要一个“回调”块来调用。

答案 1 :(得分:0)

我认为query.findObjectsInBackgroundWithBlock{是异步的,因此当请求未完成时返回时,embedLink可能为nil。所以尝试使用闭包

    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