[英]iOS Swift: function not returning correct value
我正在为我的中学运动队开发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中,我创建了一个函数,该函数根据team变量从parse.com检索视频的链接。 然后,我将这个函数(应该返回embedLink)放在Web视图的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
}
请告知您您认为如何正确完成此操作。 任何帮助表示赞赏。
因为您正在使用异步操作来查找链接,所以函数将在后台任务完成并找到链接之前返回: 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()
本身不会返回值(它不能等待在后台运行的任务); 而是在后台任务完成时调用“回调”块。
我认为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.