【问题标题】:iOS 9 : Get Value From NSURLSessionDataTask In FrameworkiOS 9:从框架中的 NSURLSessionDataTask 获取值
【发布时间】:2017-06-05 00:35:45
【问题描述】:

我有 iOS 框架,它使用 NSURLSessionDataTaskJSON 发送到服务器,如下所示:

NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
    int responseStatusCode = [httpResponse statusCode];

    if (responseStatusCode == 200)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
    [self.delegate onJsonHttpResult:data andStatusResponse:responseStatusCode];
});
    }
    else
    {
        dispatch_async(dispatch_get_main_queue(), ^{
    [self.delegate onJsonHttpResult:nil andStatusResponse:responseStatusCode];
});
    }

}];

[postDataTask resume];

但是每当我运行它时,[self.delegate onJsonHttpResult:nil andStatusResponse:responseStatusCode]; 都不会被调用。

NSURLSessionDataTask 在框架内运行时,有什么方法可以在它之外获得价值?

谢谢

【问题讨论】:

  • 方法 onjsonhttprekult 是自定义协议吗?如果有,您是否遵守此协议?
  • 嗨 KGen,是的,它是自定义协议。我尝试将 onJsonHttpResult 放在 NSURLSessionDataTask 之外,它可以工作,但我不明白什么时候放在 NSURLSessionDataTask 中
  • 你能展示一下设计的协议和你正在使用的控制器吗?您是否为控制器分配了协议,例如 controllerObj.delegate = self;等
  • responseStatusCode 的价值是多少?
  • 嗨 Piyush Patel,responseStatusCode 值如 200 或 404

标签: ios objective-c iphone xcode ios9


【解决方案1】:

我的建议是创建 APIHelperClass 并将其与完成块一起使用。 根据我的观点,这将比使用自定义 Delegate 更容易和更有效。

要创建它,您可以执行以下操作:

APIHelperClass.h

#import <Foundation/Foundation.h>

@interface APIHelperClass : NSObject

+(void)apiCallSharedSessionPOST:(NSURLRequest *)request  withCompletionHandlar:(void (^) (NSDictionary *dicResult,NSError *error, int status))completionBlock;


@end

APIHelperClass.m

#import "APIHelperClass.h"

@implementation APIHelperClass


+(void)apiCallSharedSessionPOST:(NSURLRequest *)request  withCompletionHandlar:(void (^) (NSDictionary *dicResult,NSError *error, int status))completionBlock;

        NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
        NSURLSession *session = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

        NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                                completionHandler:
                                      ^(NSData *data, NSURLResponse *response, NSError *error) {

                                          NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
                                          int responseStatusCode = (int)[httpResponse statusCode];

                                          if (error!=nil)
                                          {
                                              completionBlock(nil,error,responseStatusCode);
                                              [task suspend];
                                          }
                                          else
                                          {
                                              NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
                                              completionBlock(dic,error,responseStatusCode);
                                              [task suspend];
                                          }
                                      }];
        [task resume];

}

然后您可以将该类用于整个应用程序,而无需始终创建自定义Delegates

然后在你想要的地方使用 Like :

NSURLRequest *request;
    /*
     Configure your Request Here
     */

[APIHelperClass apiCallSharedSessionPOST:request withCompletionHandlar:^(NSDictionary *dicResult, NSError *error, int status) {

}];

【讨论】:

  • 嗨 Piyush Patel,感谢您的帮助,但我仍然需要委托在框架外返回我的值。我收到消息,每当我使用 NSURLSessionDataTask 完成时,委托变为空,我认为这导致在我收到 NSURLSessionDataTask 的响应后该委托已经释放,所以我尝试将 @property 委托更改为强并且它工作。我可以再次使用委托返回我的值。谢谢
【解决方案2】:

感谢您的帮助,但我仍然需要委托在框架外返回我的值。

我收到消息,每当我使用 NSURLSessionDataTask 完成时,委托变为空,我认为这导致在我收到 NSURLSessionDataTask 的响应后该委托已经释放,所以我尝试将 @property 委托更改为强并且它工作。我可以再次使用委托返回我的值。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多