gpt4 book ai didi

ios - 一个接一个调用两个NSURLSessionTask完成 block ?

转载 作者:行者123 更新时间:2023-11-29 00:40:26 26 4
gpt4 key购买 nike

我有以下使用 AFNetworking 调用我的服务器的设置。我使用了在 Internet 上找到的一个示例来包含一个完成 block ,这样我就知道调用何时结束。

文件“FCEngine.m”

- (void)fetchBusinessProfile:(NSString *)userID userAccessToken:(NSString *)userAccessToken completion:(void (^)(NSDictionary *json, BOOL success))completion {

/// Validate the user token again the user id.

NSDictionary *parameters = [[NSDictionary alloc]initWithObjectsAndKeys:userAccessToken,@"user_access_token",
userID,@"user_id",
nil];


AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
manager.requestSerializer = serializer;

manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

[manager POST:@"" parameters:parameters progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSLog(@"JSON Business Profile: %@", responseObject);

fetchBusinessProfileCompletion(responseObject, YES);

} failure:^(NSURLSessionTask *operation, NSError *error) {

//NSLog(@"Error: %@", error);

NSMutableDictionary *errorResponse = [[NSMutableDictionary alloc] init];

[errorResponse setObject:@"connection_error" forKey:@"state"];
[errorResponse setObject:[error localizedDescription] forKey:@"description"];

fetchBusinessProfileCompletion(errorResponse, YES);

}];

}

- (void)fetchNotifications:(NSString *)userID userAccessToken:(NSString *)userAccessToken completion:(void (^)(NSDictionary *json, BOOL success))completion {

/// Validate the user token again the user id.

NSDictionary *parameters = [[NSDictionary alloc]initWithObjectsAndKeys:userAccessToken,@"user_access_token",
userID,@"user_id",
nil];


AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
manager.requestSerializer = serializer;

manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

[manager POST:@"" parameters:parameters progress:nil success:^(NSURLSessionTask *task, id responseObject) {

//NSLog(@"JSON: %@", responseObject);

completion(responseObject, YES);

} failure:^(NSURLSessionTask *operation, NSError *error) {

//NSLog(@"Error: %@", error);

NSMutableDictionary *errorResponse = [[NSMutableDictionary alloc] init];

[errorResponse setObject:@"connection_error" forKey:@"state"];
[errorResponse setObject:[error localizedDescription] forKey:@"description"];

completion(errorResponse, YES);

}];


}

以下是我如何调用Main View Controller

- (void)MyMethods {

[self.fcEngine fetchBusinessProfile:userID userAccessToken:userAccessToken completion:^(NSDictionary *json, BOOL success) {

/// Response here


}];

[self.fcEngine fetchNotifications:self.userID userAccessToken:self.userAccessToken completion:^(NSDictionary *json, BOOL success) {

//// Response here

}];

}

现在的问题是 2 个调用是一个接一个地进行的,当我为一个调用获取数据时,例如“fetchBusinessProfile”两者上的竞争 block 都被调用。

我是不是设置错了?如果有 2 个或多个调用,我只希望为该特定 block 调用完成,而不是全部调用。

最佳答案

我认为您不了解异步和完成 block 。如果您按照上面的定义进行 2 个网络调用,它们可以按任何顺序发生。 fetchBusinessProfilefetchNotifications 中的completion 将是不同 completion blocks ... unless你让它们一样。

例如:

 [self.fcEngine fetchBusinessProfile:userID userAccessToken:userAccessToken completion:^(NSDictionary *json, BOOL success) {

/// Handle response
// Note calling the SAME completion block
sameCompletionBlockAlreadyDefined();


}];

[self.fcEngine fetchNotifications:self.userID userAccessToken:self.userAccessToken completion:^(NSDictionary *json, BOOL success) {

//// Handle response
// Note calling the SAME completion block
sameCompletionBlockAlreadyDefined();

}];

在这种情况下,sameCompletionBlockAlreadyDefined() 是一些已经定义的 block 。在这种情况下,每个调用的 block 主体确实是,但通过 sameCompletionBlockAlreadyDefined 漏斗到同一调用。您可能会感到困惑,因为 completion 在您的第一个代码段中恰好被命名为相同。

请注意,您的问题措辞非常糟糕,因此并不完全清楚您的意思。

更大的问题是您的目标是什么?您希望最后只调用一个完成 block 吗?或者您想要完全不同的完成 block ?两者都需要不同的技术。明确您的目标是什么。

前者是使用 dispatch_group 提供的最佳服务。后者需要不同的完成 block 。

调度组的示例如下:

dispatch_group_t group = dispatch_group_create();

dispatch_group_enter(group);

[self.fcEngine fetchBusinessProfile:userID userAccessToken:userAccessToken completion:^(NSDictionary *json, BOOL success) {

/// Handle response
dispatch_group_leave(group);


];

self.fcEngine fetchNotifications:self.userID userAccessToken:self.userAccessToken completion:^(NSDictionary *json, BOOL success) {

//// Handle response
dispatch_group_leave(group);

}];

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

// This would be some completion block which means all is done
completion();

关于ios - 一个接一个调用两个NSURLSessionTask完成 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39645458/

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