iOS 9 : 从框架中的 NSURLSessionDataTask 获取价值
iOS 9 : Get Value From NSURLSessionDataTask In Framework
我有 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
之外获取价值,而 运行 在框架内?
谢谢
我的建议是创建并使用 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 我的价值。谢谢
我有 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
之外获取价值,而 运行 在框架内?
谢谢
我的建议是创建并使用 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 我的价值。谢谢