iOS 9 : 从框架中的 NSURLSessionDataTask 获取价值

iOS 9 : Get Value From NSURLSessionDataTask In Framework

我有 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 之外获取价值,而 运行 在框架内?

谢谢

我的建议是创建并使用 APIHelperClass with completionBlock。 根据我的观点,这将比使用自定义 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];

}

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

然后在你想要的地方使用它喜欢:

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

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

}];

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

我收到通知,每当我完成 NSURLSessionDataTask 时,委托就会变为空,我认为这是因为在我收到 NSURLSessionDataTask 的响应后委托已经被释放,所以我尝试将 @属性 委托更改为强委托这行得通。我可以再次使用委托 return 我的价值。谢谢