如何在 Swift 3 中使用 BFTask?

Posted

技术标签:

【中文标题】如何在 Swift 3 中使用 BFTask?【英文标题】:How do I use BFTask with Swift 3? 【发布时间】:2016-10-09 02:21:16 【问题描述】:

这段代码在 Swift 2 中完美运行

override func prepare(for segue: UIStoryboardSegue?, sender: Any?) 
    if (segue!.identifier == "FeedDetailSeg") 
        let viewController:ItemDetail = segue!.destination as! ItemDetail

        viewController.DetailItem = collectionItems![self.selectedRow]

        if self.cognitoID == collectionItems![self.selectedRow].seller 
            viewController.owned = true
        
        else 
            viewController.owned = false
        

        //remove item from untapped
        //appDelegate.untapped.removeAtIndex(self.selectedRow)

        //collect view info
        self.dataStash(collectionItems![self.selectedRow].ID, itemCondition: 2).continueWithBlock(
            (task: BFTask!) -> BFTask! in

            if (task.error != nil) 
                print(task.error!.description)
             else 
                print("DynamoDB save succeeded")
            

            return nil;
        )

    

现在在 Swift 3 中,我在线上遇到错误

//collect view info    
self.dataStash(collectionItems![self.selectedRow].ID, itemCondition: 2).continueWithBlock(

说: 无法转换类型 '(BFTask<_>!) -> BFTask!' 的值到预期的参数类型 '(BFTask?) -> Any?!'

这是使用 AWS 将项目保存到 DynamoDB。

【问题讨论】:

您是否更新了 Swift 3 的安装? github.com/BoltsFramework/Bolts-Swift 【参考方案1】:

像这样将返回类型改为Any?而不是BFTask?

 //collect view info
    self.dataStash(collectionItems![self.selectedRow].ID, itemCondition: 2).continueWithBlock(
        (task: BFTask!) -> Any! in

        if (task.error != nil) 
            print(task.error!.description)
         else 
            print("DynamoDB save succeeded")
        

        return nil;
    )

谢谢:)

【讨论】:

【参考方案2】:

(更新为 Swift 3.1 语法)

您的self.dataStash 任务在尖括号中指定了泛型BFTask 的类型。假设您的 self.dataStash 是以下类型:

var dataStash : BFTask<MyObject>!

那么您必须将在dataStash 任务完成时调用的代码更改为:

self.dataStash(collectionItems![self.selectedRow].ID, itemCondition: 2).continue( (task: BFTask<MyObject>!) -> Any? in

尤其是在您的链式任务中,您可以指定 BFTask 返回类型:

continue( (task: BFTask<MyObject>!) -> BFTask<MyDifferentObject>? in

注意MyObjectMyDifferentObject 必须符合AnyObject 协议。

【讨论】:

以上是关于如何在 Swift 3 中使用 BFTask?的主要内容,如果未能解决你的问题,请参考以下文章

[BFTask isFaulted]:无法识别的选择器发送到实例错误

BFTask 在后台绘制 SpriteKit 对象正在锁定主线程

解析:如何获取所有 saveEventually 任务

如何在 swift 3.0 中编写此代码,特别是如何在 swift3 中使用宏?

如何在 Swift 3 中使用 NSLocale 获取国家代码

如何在 Swift 3 中使用 UnsafeMutablePointer?