编写完成处理程序的最佳方法是什么

时间:2019-01-17 13:11:08

标签: ios swift closures completionhandler

我目前正在努力在我的应用程序中实现应用内购买,并且在还原购买后,我希望调用完成功能来执行向用户显示警报的操作。我是用这种方式做的,发现有一条帖子说它甚至可能不会执行。我该如何正确地构造它。

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG,"classghostservice-> onstartCommand()");
        foregroundNotification(1);
        return START_NOT_STICKY;

    }

3 个答案:

答案 0 :(得分:2)

  

“我正在这样做,发现有一条帖子说它甚至可能无法执行”。

它可能不会执行,因为您未在所有路径上都调用完成处理程序。

正如Sh_Khan在回答中提到的那样,您实际上并不需要完成处理程序,您需要使用委托方法在完成时以及是否成功时得到通知。但是您的与您的特定代码有关的一个特殊问题是您没有在if语句中调用完成。

if !self.canMakePayments {
    return
}

应该是

guard canMakePayments else {
    completion()
    return
} 

在您拥有的代码中,如果canMakePayments为false,则您的完成代码将不会执行。

答案 1 :(得分:0)

这里的结果不同步

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue)

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

答案 2 :(得分:0)

假设我正在编写登录代码,并且需要完成处理程序,以便在请求完成后等待/回叫。

// MARK:-@属性

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.       
}