#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()
. И это работает.