创建NSURLSession后,似乎使用NSURLSessionDataTask进行多个Web查询可能会导致一些代码编写冗余,我想清理它。以下代码重复多次:
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
}];
[task resume];
可以从专用功能内部启动任务吗?将NSMutableURLRequest作为变量传递会很容易但是完成处理程序呢?
从理论上讲,你可以将完成处理程序作为块传递,对吧?我遇到的问题是回调变量(数据和响应)不能从提供的完成处理程序之外引用,那么如何编写引用它们的块呢?
现在我有3或4个单独编写的任务,看起来它可能保持这种状态,除非有人有想法!
编辑,解决方案:
方法定义是:
- (void) engage:(NSMutableURLRequest *)request with:(void (^)(NSData *, NSURLResponse *, NSError *))yourmom;
&安培;它需要的块文字如下:
void (^yourmom)(NSData *, NSURLResponse *, NSError *) = ^(NSData *data, NSURLResponse *response, NSError *error) {
// stuff
};
基本上,我缺少的关键是我需要我的块接受变量,以便我可以通过名称引用它们而不会出现编译器错误。上面的代码创建了一个变量接受块,让我可以绕过编译器有关超出范围变量的警告。如果是代码 [自我参与:请求:yourmom]; 出现在我们知道它来自哪里的地方。
答案 0 :(得分:0)
如果你问如何将完成块传递给实用程序方法,你应该只为你的方法提供一个块参数:
- (NSURLSessionDataTask *)startDataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))block
{
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:block];
[task resume];
return task;
}
或者,如果完成块的某些部分你一直在重复,那么继续把它放在你的实用程序方法中,然后调用调用者的块:
- (NSURLSessionDataTask *)startDataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))block
{
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
// do here stuff that I'll always do, such as logging errors, checking response codes, etc.
// when that's done, I can now invoke the caller's block
if (block) {
block(data, response, error);
}
}];
[task resume];
return task;
}
答案 1 :(得分:0)
我想说在NSURLSession上做一个类别并执行以下操作:
首先在头文件中输入一个完成块:
typedef void (^NSURLSessionDataTaskCompletionHandler) (NSData *data, NSURLResponse *response, NSError *error);
然后在头文件中添加一个方法:
- (NSURLSessionDataTask *)startTaskWithRequest:(NSURLRequest *)request completionHandler:(NSURLSessionDataTaskCompletionHandler)completionHandler;
最后在实现文件中的函数体:
- (NSURLSessionDataTask *)startTaskWithRequest:(NSURLRequest *)request completionHandler:(NSURLsessionDataTaskCompletionHandler)completionHandler
{
NSURLSessionDataTask *task = [self dataTaskWithRequest:request completionHandler:completionHandler];
[task resume];
return task;
}
现在你很容易做到这样的事情:
[session startTaskWithRequest:request completionHandler:(NSData *data, NSURLResponse *response, NSError *error){
// do stuff
}];