从闭包中调用“完成”时出错

Posted

技术标签:

【中文标题】从闭包中调用“完成”时出错【英文标题】:Error calling "fulfill" from closure 【发布时间】:2016-10-13 18:32:33 【问题描述】:

这是我的错误...

线程 1:EXC_BAD_ACCESS(代码=1,地址=0x18)

这是我的产品请求代表...

class ProductRequestDelegate : NSObject, SKProductsRequestDelegate 

    private var products: ([SKProduct]) -> Void

    init(products: @escaping ([SKProduct]) -> Void) 

        self.products = products
    

    public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) 

        products(response.products)
    

    public func request(_ request: SKRequest, didFailWithError error: Error) 

    

这是请求...

fileprivate var productsRequest: SKProductsRequest?

public func getProducts() -> Promise<Set<SKProduct>> 

        return Promise  fulfill, reject in

            productsRequest?.cancel()

            productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers)

            productsRequest!.delegate = ProductRequestDelegate  products in

                self.productsRequest = nil

                fulfill(Set(products))
            

            productsRequest!.start()
        
    

此调用导致发生错误...

_ = iAPHelper.getProducts()

任何想法为什么这不起作用?似乎委托已解除分配。

【问题讨论】:

【参考方案1】:

SKProductsRequest 的委托属性是unowned(unsafe),因此分配给它的对象被释放。 (仪器在启动僵尸后通知我释放。)

所以,我添加了对包含函数getProducts() 的类的委托的引用。它有效。

【讨论】:

以上是关于从闭包中调用“完成”时出错的主要内容,如果未能解决你的问题,请参考以下文章

从委托的源 ViewController 调用异步闭包

回调函数和闭包

Swift - 从闭包内返回变量

在 Swift 中传递和存储闭包/回调

Swift 闭包完成处理程序

如何处理完成闭包中的多个错误