我有iOS框架,它使用NSURLSessionDataTask将JSON发送到服务器,如下所示:
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在框架内运行时,有没有办法从它的外部获取值?
谢谢
发布于 2017-01-23 12:29:56
谢谢你的帮助,但我仍然需要委托在框架外返回我的值。
每当我完成NSURLSessionDataTask时,委托就变成了空,我想这是因为在我得到NSURLSessionDataTask的响应后,委托已经被释放了,所以我试着把@property委托改为strong,它就起作用了。我可以再次使用委托返回我的值。谢谢
发布于 2017-01-20 15:48:03
我的建议是在completionBlock中创建和使用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。
然后在你想要的地方使用它,比如:
NSURLRequest *request;
/*
Configure your Request Here
*/
[APIHelperClass apiCallSharedSessionPOST:request withCompletionHandlar:^(NSDictionary *dicResult, NSError *error, int status) {
}];https://stackoverflow.com/questions/41756576
复制相似问题