Каков наилучший способ написать обработчик завершения - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я работаю над реализацией покупок внутри приложения в своем приложении, и после восстановления покупок я хотел бы вызвать завершение, чтобы выполнить действие по отображению предупреждения для пользователя. Я делал это таким образом и нашел пост, в котором говорится, что он может даже не быть выполнен. Как я могу правильно структурировать это.

func restoreIAPPurchases(completion: (() -> Void)) {
    if !self.canMakePayments {
        return
    }
    self.paymentQueue.restoreCompletedTransactions()
    completion()
}

let alertController = UIAlertController.vy_alertControllerWithTitle(nil, message:  "Restore will reprocess your existing subscription. You will not be charged", actionSheet: false)
    alertController.addAction("Ok")
    alertController.addActionWithTitle("Restore", style: .default) {
    IAPService.shared.restoreIAPPurchases {
       UIAlertController.vy_showAlertFrom(self, title: "Restore complete", message: "Successfully restored purchase")
     }
}
     alertController.presentFrom(self)

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Предположим, я пишу код для входа в систему и мне нужно Завершение Hander для ожидания / обратного вызова после завершения запроса.

// MARK: - @ Properties

var signInCompletionHandler : ((_ result : AnyObject?, _ error : NSError?) -> Void)?

var viewController : UIViewController?

// MARK: - вызвать метод входа в систему с обработчиком завершения.

 func login(withViewControler viewController : UIViewController, completionHandler : @escaping (_ result : AnyObject?, _ error : NSError?) -> Void)  {
 // Write your logic here.       
}
0 голосов
/ 17 января 2019

«Я делал это таким образом и нашел сообщение, в котором говорится, что оно может даже не быть выполнено»

Возможно, он не будет выполнен, потому что вы не вызываете обработчик завершения на всех путях.

Как Ш_Кхан упомянул в своем ответе, вам на самом деле не нужен обработчик завершения, вам нужно использовать методы делегата, чтобы получать информацию о его завершении и о том, был ли он успешным или нет. Но ваша особая проблема с вашим конкретным кодом заключается в том, что вы не вызываете завершение в операторе if.

if !self.canMakePayments {
    return
}

Вероятно, должно быть

guard canMakePayments else {
    completion()
    return
} 

В вашем коде, если canMakePayments имеет значение false, ваш код завершения не будет выполнен.

0 голосов
/ 17 января 2019

Результат здесь асинхронный

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue)

или

func paymentQueue(_ queue: SKPaymentQueue, 
restoreCompletedTransactionsFailedWithError error: Error)
...