且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Web 服务完成后的完成块?

更新时间:2022-06-27 07:06:04

在 else 块中,您应该像这样调用完成处理程序:

In your else block you should call the completion handler like so:

// [code omitted for brevity]

                       NSLog(@"UNREGISTER PUSH RESPONSE: %@", _string);

                       id obj= [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
                       if (!obj) {
                            //NSLog(@"REGISTER PUSH NOTIFICATIONS ERROR: %@", error);

                       } else {
                            completionHandler(resultsArray); // add this line to actually call the completion block passed in
                            //NSLog(@"REGISTER PUSH NOTIFICATIONS DATA: %@", obj);

                           //self.accessToken = [obj valueForKey:@"access_token"];
                           //NSLog(@"ACCESS TOKEN: %@",self.accessToken);
                       }


                   }];

还要确保传入实际数组而不是我传入的 resultsArray 参数.

Also make sure to pass in the actual array instead of the resultsArray parameter I passed.

您基本上要做的是传入一个不知道何时执行的函数(或块")(在任何异步任务完成后,您必须自己执行此操作).所以你从你的调用方法传入了块:

What you are basically doing is passing in a function (or "block") which does not know when to execute (you'll have to do that yourself after any asynchronous tasks have finished). So you passed in the block from your calling method:

[services callUnregisterForPushNotifications:savedAccessToken pushToken:savedPushToken completionBlock:^(NSMutableArray *resultsArray) {

        NSLog(@">>> COMPLETE! <<<");

        [self.loadingView removeFromSuperview];
    }];

包含在花括号中的代码块被传递给函数 callUnregisterForPushNotifications:pushToken:completionHandler: 并分配给 completionHandler 参数,该参数现在包含最初调用方法时传入的代码.接收 completionHandler 块的方法负责在异步任务(网络请求)完成后调用它(如您在我发布的第一个片段中所见).

The block of code contained in the curly braces is passed on to the function callUnregisterForPushNotifications:pushToken:completionHandler: and assigned to the completionHandler parameter which now contains the block of code you passed in when initially calling the method. The method that receives the completionHandler block is responsible for calling it once the asynchronous tasks (network requests) are finished (as you can see in the first snippet I posted).

completionHandler(resultsArray);

这样,一旦您的请求完成(else 块),您就可以执行传入的完成块.这实际上意味着执行我之前传入的代码块因为现在我们有了网络操作的数据."

That way, once your request has finished (the else block) you are ready to execute the completion block that was passed in. That will effectively mean "Execute the block of code I passed in earlier because now we have the data from the network operation."