Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
Swift 异步任务后返回数据_Swift - Fatal编程技术网

Swift 异步任务后返回数据

Swift 异步任务后返回数据,swift,Swift,我正在使用库上传图像。此库正在异步工作 我的职能: func upload() -> String { let imageData:NSData = UIImageJPEGRepresentation(pureImage!, 100)! var picture="" SRWebClient.POST("http://domain.com/upload.php") .data(imageData, fieldName:"image_field", da

我正在使用库上传图像。此库正在异步工作

我的职能:

func upload() -> String {
    let imageData:NSData = UIImageJPEGRepresentation(pureImage!, 100)!
    var picture=""
    SRWebClient.POST("http://domain.com/upload.php")
        .data(imageData, fieldName:"image_field", data: ["username":"test","key":"test"])
        .send({(response:AnyObject!, status:Int) -> Void in
            if status == 200 {
                let responseJSON = response! as! Dictionary<String, AnyObject>
                let s_status=responseJSON["status"] as! Int
                if s_status == 1 {
                    picture=responseJSON["picture"] as! String
                    print(picture)
                }
            }
            },failure:{(error:NSError!) -> Void in
                picture=""
        })
    return picture
}
func upload()->字符串{
让imageData:NSData=uiImageJPEG表示(pureImage!,100)!
var picture=“”
SRWebClient.POST(“http://domain.com/upload.php")
.data(imageData,字段名:“image_字段”,数据:[“用户名”:“测试”,“键”:“测试”])
.send({(响应:AnyObject!,状态:Int)->Void in
如果状态==200{
让responseJSON=response!as!字典
设s_status=responseJSON[“status”]为!Int
如果s_状态==1{
picture=responseJSON[“picture”]作为!字符串
印刷品(图片)
}
}
},失败:{(错误:NSError!)->在中无效
picture=“”
})
返回图片
}

正如你所看到的,我必须返回图片名。但现在它总是返回空字符串,因为上传过程是异步的。上载过程后如何返回图片名称?

显然,您不能将图片名称作为函数结果返回,除非您希望等待异步任务完成,并且等待将使其再次成为同步任务

有三种非常常见的方法可以使异步任务交付结果:

  • 向任务传递回调(如果需要捕获状态或引用,则传递回调函数或完成块)。任务完成后,它将调用回调。在您的例子中,回调可以将图像名称作为参数,然后回调代码需要决定如何处理它

  • 如果任务封装在对象中,则允许该对象具有委托。任务完成后,将调用委托方法。该方法要么将图像名称作为参数获取,要么可以从它所委托的对象中查询图像名称(通常您会将对象本身作为参数传递给委托,这是苹果公司的常见做法和良好的编码风格)

  • 发送已上载图像的通知。图像名称可以是通知的对象;或者封装图像名称和其他属性的对象。任何有兴趣知道上传任务何时完成的人都可以注册该通知

  • 关于上述选项的一些注意事项:

    我会小心使用通知。虽然它们易于使用,并且在大型项目中分布的许多组件需要被告知事件时非常有用,但是它们很难调试(您无法在调试器中轻松地遵循代码流),并且它们创建了一个非常丢失的耦合(这可能是可取的,也可能是不可取的),但是与通知本身的强耦合。此外,通知不能返回一个值,以防每次都是必需的

    委托始终是一个很好的选择,但它强制用户创建一个实现委托协议的类。这通常只在您需要不止一个回调方法或者计划频繁调用委托方法时才有回报。学员非常适合进行单元测试


    回调就像一个只有一个回调方法的小委托。如果您经常在移动中执行“触发并忘记”任务,并且只需要一个回调,在成功和失败时都会调用该回调;而且它只会被调用一次,并且永远不需要回收它,那么回调通常比委托更可取。它具有委托的所有优点,但更为轻量级。

    显然,您不能将图片名称作为函数结果返回,除非您希望等待异步任务完成,并且等待将使其再次成为同步任务

    有三种非常常见的方法可以使异步任务交付结果:

  • 向任务传递回调(如果需要捕获状态或引用,则传递回调函数或完成块)。任务完成后,它将调用回调。在您的例子中,回调可以将图像名称作为参数,然后回调代码需要决定如何处理它

  • 如果任务封装在对象中,则允许该对象具有委托。任务完成后,将调用委托方法。该方法要么将图像名称作为参数获取,要么可以从它所委托的对象中查询图像名称(通常您会将对象本身作为参数传递给委托,这是苹果公司的常见做法和良好的编码风格)

  • 发送已上载图像的通知。图像名称可以是通知的对象;或者封装图像名称和其他属性的对象。任何有兴趣知道上传任务何时完成的人都可以注册该通知

  • 关于上述选项的一些注意事项:

    我会小心使用通知。虽然它们易于使用,并且在大型项目中分布的许多组件需要被告知事件时非常有用,但是它们很难调试(您无法在调试器中轻松地遵循代码流),并且它们创建了一个非常丢失的耦合(这可能是可取的,也可能是不可取的),但是与通知本身的强耦合。此外,通知不能返回一个值,以防每次都是必需的

    委托始终是一个很好的选择,但它强制用户创建一个实现委托协议的类。这通常只在您需要不止一个回调方法或者计划频繁调用委托方法时才有回报。学员非常适合进行单元测试

    回调就像一个只有一个回调方法的小委托。如果您经常在移动中执行“触发并忘记”任务,并且只需要一个回调,在成功和失败时都会调用该回调;而且它只会被调用一次,并且永远不需要回收它,那么回调通常比委托更可取。它具有d的所有优点
     func upload(completionHandler : (pictureName : NSString?)-> Void){
      let imageData:NSData = UIImageJPEGRepresentation(pureImage!, 100)!
        var picture=""
        SRWebClient.POST("http://domain.com/upload.php")
            .data(imageData, fieldName:"image_field", data: ["username":"test","key":"test"])
            .send({(response:AnyObject!, status:Int) -> Void in
                if status == 200 {
                    let responseJSON = response! as! Dictionary<String, AnyObject>
                    let s_status=responseJSON["status"] as! Int
                    if s_status == 1 {
                        picture=responseJSON["picture"] as! String
                        print(picture)
                        completionHandler(pictureName: picture)
                    }
                }
                },failure:{(error:NSError!) -> Void in
                    picture=""
                     completionHandler(pictureName: nil)
            })
    }
    
     func upload() -> Promise<String>