首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 9:从框架中的NSURLSessionDataTask获取值

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

Stack Overflow用户
提问于 2017-01-20 13:18:35
回答 2查看 241关注 0票数 1

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

代码语言:javascript
复制
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在框架内运行时,有没有办法从它的外部获取值?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-23 12:29:56

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

每当我完成NSURLSessionDataTask时,委托就变成了空,我想这是因为在我得到NSURLSessionDataTask的响应后,委托已经被释放了,所以我试着把@property委托改为strong,它就起作用了。我可以再次使用委托返回我的值。谢谢

票数 0
EN

Stack Overflow用户

发布于 2017-01-20 15:48:03

我的建议是在completionBlock中创建和使用APIHelperClass。根据我的观点,这将比使用自定义Delegate更容易和有效。

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

APIHelperClass.h

代码语言:javascript
复制
#import <Foundation/Foundation.h>

@interface APIHelperClass : NSObject

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


@end

APIHelperClass.m

代码语言:javascript
复制
#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

然后在你想要的地方使用它,比如:

代码语言:javascript
复制
NSURLRequest *request;
    /*
     Configure your Request Here
     */

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

}];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41756576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档