首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速控制流程:

快速控制流程:
EN

Stack Overflow用户
提问于 2015-03-06 00:54:08
回答 1查看 153关注 0票数 1

在下面的代码中,我试图使用Facebook获取我朋友的列表,并在另一个视图控制器上显示他们。我在函数createFriendsInfo(data : NSArray)中调用函数loginViewShowingLoggedInUser。函数被调用,数据被填充到数组中。

问题是,在createFriendsInfo中的循环完成数组中的数据填充之后,控件直接进入视图控制器。相反,它应该首先在函数中的循环之后完成语句的执行,然后控件应该返回到应该执行loginViewShowingLoggedInUserperformSegueWithIdentifier:

我是Swift的新手,我需要一些帮助来理解代码中的控制流。

代码语言:javascript
运行
复制
import Foundation
import UIKit

class FBViewController : UIViewController, FBLoginViewDelegate {


    @IBOutlet var fbLogin: FBLoginView!
    var friendNames : [String] = []
    var friendPics : [UIImage] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        //var fbl: FBLoginView = FBLoginView() //create login button on UIController
        //self.view.addSubview(fbl)
        // Do any additional setup after loading the view, typically from a nib.
        self.fbLogin.delegate = self
        self.fbLogin.readPermissions = ["public_profile", "email", "user_friends"]


    }

    func createFriendsInfo(data : NSArray)
    {
        println("Start Create")
        for i in 0...data.count {
            let valueDict : NSDictionary = data[i] as NSDictionary
            let userID = valueDict.objectForKey("id") as String
            self.friendNames.append(valueDict.objectForKey("name") as String)
            let id = valueDict.objectForKey("name") as String
            var url = NSURL (string : "http://graph.facebook.com/\(userID)/picture?type=large")
            let urlRequest = NSURLRequest(URL: url!)
            let session = NSURLSession.sharedSession()

            var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?>=nil
            var error: NSErrorPointer = nil
            if let ImageData : NSData = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: response, error:nil)?
            {
                var image = UIImage( data : ImageData)
                self.friendPics.append(image!)
                println("Image Appended")
            }
        }

        println("Create Friends Info \(self.friendNames.count) \(self.friendPics.count) ")
    }


    // Facebook Delegate Methods

    func loginViewShowingLoggedInUser(loginView : FBLoginView!) {

                println("Start Fetched")
                var friendsRequest : FBRequest = FBRequest.requestForMyFriends()
                friendsRequest.startWithCompletionHandler{(connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in
                    var resultdict = result as NSDictionary
                    println("Result Dict: \(resultdict)")
                    var Data : NSArray = resultdict.objectForKey("data") as NSArray
                    self.createFriendsInfo(Data)
                    println("Perform \(self.friendNames.count) \(self.friendPics.count) ")
                    self.performSegueWithIdentifier("toFriendList", sender: self)
                    println("Perform \(self.friendNames.count) \(self.friendPics.count) ")
        //
                }

        //self.performSegueWithIdentifier("toFriendList", sender: self)

    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func loginViewFetchedUserInfo(loginView : FBLoginView!, user: FBGraphUser) {
    }

    func loginViewShowingLoggedOutUser(loginView : FBLoginView!) {
        println("User Logged Out")
        self.friendNames = []
        self.friendPics = []
        println("Logout \(self.friendNames.count) \(self.friendPics.count) ")
    }

    func loginView(loginView : FBLoginView!, handleError:NSError) {
        println("Error: \(handleError.localizedDescription)")
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if((segue.identifier == "toFriendList" ) && (self.friendNames.count > 0))
        {
            var fl : friendList = segue.destinationViewController as friendList
            println("Prepare \(self.friendNames.count) \(self.friendPics.count) ")
            fl.name1 = self.friendNames
            fl.profilepics1 = self.friendPics
        }

    }






}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-06 04:32:08

for循环在createFriendsInfo中有错误的上限;通常是0..<data.count。尽管如此,

代码语言:javascript
运行
复制
for i in 0...data.count {
  let valueDict : NSDictionary = data[i] as NSDictionary
  // ...

将‘失败’当i == data.count

但是,对于控制流,friendsRequest完成处理程序肯定不会在主队列上运行。这意味着performSegueWithIdentifier会“迷路”。将代码更改为:

代码语言:javascript
运行
复制
func loginViewShowingLoggedInUser(loginView : FBLoginView!) {
  println("Start Fetched")
  var friendsRequest : FBRequest = FBRequest.requestForMyFriends()

  friendsRequest.startWithCompletionHandler{
      (connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in
    var resultdict = result as NSDictionary
    println("Result Dict: \(resultdict)")
    var Data : NSArray = resultdict.objectForKey("data") as NSArray
    self.createFriendsInfo(Data)
    println("Perform \(self.friendNames.count) \(self.friendPics.count) ")
    dispatch_async(dispatch_get_main_queue()) {
      self.performSegueWithIdentifier("toFriendList", sender: self)
      println("Perform \(self.friendNames.count) \(self.friendPics.count) ")
      //
    }
  }
}

必须在主队列上执行所有UI操作。

请注意,您可能需要在self的闭包中声明dispatch_asyncunowned (我忘记了当前的Swift状态)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28890624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档