Ошибка вызова «выполнить» из закрытия

#swift #storekit #promisekit

#swift #storekit #promisekit

Вопрос:

Вот моя ошибка…

Поток 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) , поэтому назначенный ему объект освобождается. (Инструменты сообщили мне об освобождении после включения zombies.)

Итак, я добавил ссылку на делегат к классу, который содержит функцию getProducts() . И это работает.