在拦截完成处理程序中获取 NSURLSessionDataTask
Get NSURLSessionDataTask In Intercepted Completion Handler
我正在使用 AFNetworking,我正在覆盖 -dataTaskWithRequest:completionHandler:
以基本上对我的请求进行 MITM,并在调用实际响应块之前进行一些错误处理。但是,我需要在我截获的完成处理程序中访问 -dataTaskWithRequest:completionHandler:
方法创建的 NSURLSessionDataTask 对象。所以我对该方法的重写如下所示:
-(NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler {
void (^interceptedCompletionHandler)(NSURLResponse *, id, NSError *) = ^void(NSURLResponse * response, id responseObject, NSError * error) {
if (error) {
// Do custom stuff here that needs to use task.taskIdentifier
}
// Then call the original completion handler
completionHandler(response, responseObject, error);
}
return [super dataTaskWithRequest:request completionHandler:interceptedCompletionHandler];
}
这可能吗?
我知道 AFNetworking 可以很容易地添加它,因为完成处理程序的响应参数在 AFURLSessionManager
中设置为 task.response
,也就是包含 [=] 的 class 5=] 调用完成处理程序。
我已经弄明白了。通过声明块内联并将 super 调用分配给变量,我能够使用生成的任务对象:
-(NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler {
__block NSURLSessionDataTask* task = [super dataTaskWithRequest:request completionHandler:
^void(NSURLResponse * response, id responseObject, NSError * error)
{
// I can use task here
if (error) {
// Do custom stuff here that needs to use task.taskIdentifier
}
// Then call the original completion handler
completionHandler(response, responseObject, error);
}
return task;
}
我正在使用 AFNetworking,我正在覆盖 -dataTaskWithRequest:completionHandler:
以基本上对我的请求进行 MITM,并在调用实际响应块之前进行一些错误处理。但是,我需要在我截获的完成处理程序中访问 -dataTaskWithRequest:completionHandler:
方法创建的 NSURLSessionDataTask 对象。所以我对该方法的重写如下所示:
-(NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler {
void (^interceptedCompletionHandler)(NSURLResponse *, id, NSError *) = ^void(NSURLResponse * response, id responseObject, NSError * error) {
if (error) {
// Do custom stuff here that needs to use task.taskIdentifier
}
// Then call the original completion handler
completionHandler(response, responseObject, error);
}
return [super dataTaskWithRequest:request completionHandler:interceptedCompletionHandler];
}
这可能吗?
我知道 AFNetworking 可以很容易地添加它,因为完成处理程序的响应参数在 AFURLSessionManager
中设置为 task.response
,也就是包含 [=] 的 class 5=] 调用完成处理程序。
我已经弄明白了。通过声明块内联并将 super 调用分配给变量,我能够使用生成的任务对象:
-(NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler {
__block NSURLSessionDataTask* task = [super dataTaskWithRequest:request completionHandler:
^void(NSURLResponse * response, id responseObject, NSError * error)
{
// I can use task here
if (error) {
// Do custom stuff here that needs to use task.taskIdentifier
}
// Then call the original completion handler
completionHandler(response, responseObject, error);
}
return task;
}