如何制作一个组织多个NSURLSessionDataTask的功能?

时间:2014-05-22 21:42:20

标签: ios objective-c

创建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]; 出现在我们知道它来自哪里的地方。

2 个答案:

答案 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
}];