Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-Swift-sync和async_Ios_Swift_Asynchronous_Grand Central Dispatch - Fatal编程技术网

iOS-Swift-sync和async

iOS-Swift-sync和async,ios,swift,asynchronous,grand-central-dispatch,Ios,Swift,Asynchronous,Grand Central Dispatch,请帮助我解决这个问题-经过大量(不是那么有效的…)搜索后,我无法独自完成这项工作 我有以下方法: showLoadingAnimation() 在后台任务运行时显示加载动画的步骤 hideLoadingAnimation() 在所有背景任务完成后立即隐藏加载动画的步骤 getUserFacebookData() 获取Facebook用户数据 uploadUserFacebookDataToServer() 将Facebook用户数据上载到服务器(并使用它们执行任务) 我想表演的是: 显示

请帮助我解决这个问题-经过大量(不是那么有效的…)搜索后,我无法独自完成这项工作

我有以下方法:

showLoadingAnimation()
在后台任务运行时显示加载动画的步骤

hideLoadingAnimation()
在所有背景任务完成后立即隐藏加载动画的步骤

getUserFacebookData()
获取Facebook用户数据

uploadUserFacebookDataToServer()
将Facebook用户数据上载到服务器(并使用它们执行任务)

我想表演的是:

  • 显示加载动画:showLoadingAnimation()
  • 从Facebook获取用户数据:getFacebookData()
    • 等待下载这些数据
  • 下载Facebook用户数据后,立即将这些数据上载到服务器:uploadUserFacebookDataToServer()
    • 等待,直到上载这些数据
  • 隐藏加载动画:hideloadinganization()
  • 现在我的问题是,我不知道如何解决这个问题。我知道,我应该使用同步和/或异步任务,GCD。。。但我不知道怎么做,也找不到合适的指南

    有人能通过这些功能向我解释一下吗? 谢谢

    更新:

    谢谢你,蔡志伟,这正是我所希望的答案

    现在好像行了,通话顺序还可以, 但现在的问题和开头一样:

    uploadUserFacebookDataToServer()
    
    不要等到

    getUserFacebookData
    
    从Facebook下载用户数据,这就是为什么它无法处理从Facebook返回的必要数据

    getUserFacebookData
    
    有什么想法吗?这和调度有关吗

    更新2:

    按照你的要求,以下是功能。我希望,有了这些信息,你可以帮助我解决这个问题,了解整个过程

    func getFacebookUserData(completionHandler: () -> Void)
    {
        println("getFacebookUserData")
    
        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
        graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
    
            if ((error) != nil)
            {
                // Process error
                println("Error: \(error)")
            }
            else
            {
                let userID : NSString = result.valueForKey("id") as NSString!
    
                var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
                defaults.setObject(userID, forKey: "settings_facebookID")
                self.facebookID_fromSettings = userID
            }
        })
    

    因此,第一个函数从FB服务器获取facebookID,但是这个过程需要时间,它不会立即给出结果。第二个函数应该处理这些数据,这就是为什么它应该“等待”直到第一个函数返回请求的数据

    我可以通过将这两个功能构建在一个中来解决这个问题,但这“不优雅”,我还想在项目的其他部分使用这种(同步/异步调度)方法


    谢谢你试着帮助我

    [编辑]使用
    dispatch\u group\t
    检查以下代码

    步骤1:显示加载动画()

    第二步:
    dispatch\u group\u t faceBookService=dispatch\u group\u create()

    第三步:
    dispatch\u group\u async\u enter(facebook服务、队列、^{
    getUserFacebookData()
    //下面给出的行应该在完成处理程序内部,或者在上面的任务完成之后
    派遣团队离开(faceBookService);
    });

    第4步:
    dispatch\u group\u async\u enter(facebook服务、队列、^{
    uploadUserFacebookDataToServer()
    //下面给出的行应该在完成处理程序内部,或者在上面的任务完成之后
    派遣团队离开(faceBookService);
    });

    第5步:
    dispatch\u group\u notify(faceBookService,dispatch\u get\u main\u queue()^{
    //完成两项任务后调用。
    Hideloadinganization()
    
    });

    您可以使用完成处理程序:

       func showLoadingAnimation() {
            self.getUserFacebookData({ () -> Void in
                self.uploadUserFacebookDataToServer({ () -> Void in
                    self.hideLoadingAnimation()
                })
            })
        }
    
        func getUserFacebookData(completionHandler: () -> Void) {
            println("getUserFacebookData")
            completionHandler()
        }
    
        func uploadUserFacebookDataToServer(completionHandler: () -> Void) {
            println("uploadUserFacebookDataToServer")
            completionHandler()
        }
    
        func hideLoadingAnimation() {
            println("hideLoadingAnimation")
        }
    
    调用
    showLoadingAnimation()
    后,其余操作将异步完成


    参考资料:

    是同步还是异步的
    getFacebookData()
    uploadUserFacebookDataToServer()?他们是否有一个完成处理器?显示这些方法的声明请注意,它们只是简单的函数,没有任何参数或特殊属性(如完成处理程序)。我很笨,所以我不想把事情搞砸,这就是为什么我现在尽量保持简单。希望在您的帮助下,我能够扩展它们。您的问题解决了吗?没有,我刚刚向您上传了所需的信息(函数)。您好Deepak Samuel Rajan,谢谢您的回答,我将尽快检查此解决方案!我试图输入你的代码,但Xcode(Swift)没有接受,我不得不重写它。请您将蔡志伟给出的代码扩展到调度,好吗?谢谢蔡志伟。我听从了你的建议,现在通话顺序还可以,但现在又出现了其他问题。请阅读我的更新。非常感谢。我需要查看getUserFacebookData()的代码才能知道发生了什么。您使用了什么连接类?第二次会议?网络连接?一个是异步的,一个是同步的。如果是异步的,则需要将下一个块放入连接的完成处理程序块中。
    
       func showLoadingAnimation() {
            self.getUserFacebookData({ () -> Void in
                self.uploadUserFacebookDataToServer({ () -> Void in
                    self.hideLoadingAnimation()
                })
            })
        }
    
        func getUserFacebookData(completionHandler: () -> Void) {
            println("getUserFacebookData")
            completionHandler()
        }
    
        func uploadUserFacebookDataToServer(completionHandler: () -> Void) {
            println("uploadUserFacebookDataToServer")
            completionHandler()
        }
    
        func hideLoadingAnimation() {
            println("hideLoadingAnimation")
        }