NSURLSession uploadTaskWithRequest - 在完成处理程序中使用块

时间:2014-04-06 18:57:48

标签: objective-c objective-c-blocks nsurlsession

我有一个管理api所有调用的类。 它有一个管理方法,让我们调用这个callAPIMethod:

此方法接受successfail阻止。

在此方法中,我调用uploadTaskWithRequest来调用API。 在uploadTaskWithRequest完成处理程序中,我希望(取决于结果)将结果传递回successfail块。

我对此有些疑问。它的工作原理是保持一切都非常整洁,但是当我使用成功/失败块调用callAPIMethod时,它会锁定UI / MainThread,而不是像我期望的那样异步。

我应该如何实施这种模式?还是有更好的方法来解决它?

我不需要支持iOS7之前的版本。

由于

编辑:上面讨论的基本实现。

- (void)callApiMethod:(NSString *)method withData:(NSString *)requestData as:(kRequestType)requestType success:(void (^)(id responseData))success failure:(void (^)(NSString *errorDescription))failure {
    [redacted]
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session uploadTaskWithRequest:request
                                                       fromData:postData
                                              completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      if (error) {
                                          failure(error.description);
                                      } else {
                                          NSError *jsonError;
                                          id responseData = [NSJSONSerialization
                                                             JSONObjectWithData:data
                                                             options:kNilOptions
                                                             error:&jsonError];
                                          if (jsonError) {
                                              failure(jsonError.description);
                                          } else {
                                              success(responseData);
                                          }
                                      }
                                  }];

    [task resume];
}

CallAPI方法,使用如下(来自UITableViewController):

[apiController callApiMethod:@"users.json?action=token"
                    withData:loginData
                          as:kRequestPOST
                     success:^(id responseData) {
                         if ([responseData isKindOfClass:[NSDictionary class]]) {
                             if ([responseData objectForKey:@"token"]) {
                                 //Store token/credentials
                             } else if ([responseData objectForKey:@"error"]) {
                                 //Error
                                 [self displayErrorMessage:[responseData objectForKey:@"error"]];
                                 return;
                             } else {
                                 //Undefined Error
                                 [self displayErrorMessage:nil];
                                 return;
                             }
                         } else {
                             //Error
                             [self displayErrorMessage:nil];
                             return;
                         }

                         //If login success

                     }
                     failure:^(NSString *errorDescription) {
                         [self displayErrorMessage:errorDescription];
                     }];

1 个答案:

答案 0 :(得分:0)

您的NSURLSession代码看起来不错。我建议添加一些断点,以便您可以确定它是否在某处死锁,如果是,那么在哪里。但是,此代码示例中没有任何内容可以表明任何此类问题。

我建议您确保将所有UI调用分派回主队列。可以在后台队列上调用此NSURLSessionUploadTask完成处理程序,但所有UI更新(警报,导航,UIView控件的更新等)必须在主队列上进行。