gpt4 book ai didi

ios - Web服务完成后的完成 block ?

转载 作者:行者123 更新时间:2023-12-01 18:45:56 25 4
gpt4 key购买 nike

我在一个名为 WebServices 的类中实现了一个 RESTful API。我从我的应用程序中的其他类调用此类中的方法,并希望在成功完成 Web 服务后执行操作。我有一个完成 block 作为我的方法头的一部分,但我不确定我是否正确使用它们,因为应用程序似乎永远不会到达方法调用的完成部分。这就是我调用我的方法的方式:

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

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

[self.loadingView removeFromSuperview];
}];

我调用的方法如下所示:
- (void)callUnregisterForPushNotifications:(NSString *)accessToken
pushToken:(NSString *)pushToken
completionBlock:(void (^)(NSMutableArray *resultsArray))completion{

NSLog(@"UNREGISTER FOR PUSH CALLED!");

NSLog(@"PUSH TOKEN %@", pushToken);

NSString *appendUrl = @"alerts/unregisterpush/";

NSLog(@"APPEND URL %@",appendUrl);

NSURL *unregisterUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", BaseURLString, appendUrl]];
NSLog(@"UNREGISTER URL: %@",unregisterUrl);

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:unregisterUrl
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];

[request setHTTPMethod:@"PUT"];

NSString *appendToken = [NSString stringWithFormat:@"Bearer %@", accessToken];
NSLog(@"TOKEN: %@",appendToken);

[request addValue:appendToken forHTTPHeaderField:@"Authorization"];
[request addValue:@"application/json, text/plain, */*" forHTTPHeaderField:@"Accept"];
[request addValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];


NSString *postString = [NSString stringWithFormat:@"{\"Guid\":\"%@\"}",pushToken];
NSLog(@"POST STRING: %@",postString);
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

NSLog(@"REQUEST %@",request);

[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

NSLog(@"UNREGISTER PUSH NOTIFICATIONS RESPONSE: %@", response);
NSLog(@"UNREGISTER PUSH NOTIFICATIONS ERROR: %@", error);
NSLog(@"UNREGISTER PUSH NOTIFICATIONS DATA: %@", data);

NSData *_data = data;// ... whatever
NSMutableString *_string = [NSMutableString stringWithString:@""];
for (int i = 0; i < _data.length; i++) {
unsigned char _byte;
[_data getBytes:&_byte range:NSMakeRange(i, 1)];
if (_byte >= 32 && _byte < 127) {
[_string appendFormat:@"%c", _byte];
} else {
[_string appendFormat:@"[%d]", _byte];
}
}
NSLog(@"UNREGISTER PUSH RESPONSE: %@", _string);

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

} else {
//NSLog(@"REGISTER PUSH NOTIFICATIONS DATA: %@", obj);

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

}];
}

任何建议/意见将不胜感激,在此先感谢!

最佳答案

在你的 else block 中,你应该像这样调用完成处理程序:

// [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我传递的参数。

您基本上所做的是传入一个不知道何时执行的函数(或“ block ”)(您必须在任何异步任务完成后自己执行此操作)。因此,您从调用方法传入了 block :
[services callUnregisterForPushNotifications:savedAccessToken pushToken:savedPushToken completionBlock:^(NSMutableArray *resultsArray) {

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

[self.loadingView removeFromSuperview];
}];

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

这样,一旦您的请求完成( else block ),您就可以执行传入的完成 block 。这实际上意味着“执行我之前传入的代码块,因为现在我们有来自网络运营。”

关于ios - Web服务完成后的完成 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35728575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com