我正在为我的高中运动队在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
}
请告知您如何才能正确完成此操作。任何帮助表示赞赏。
答案 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