项目从AFN 2.0 迁移到 3.0,因为代码历史问题,需要通过NSURLSessionTask 获取到responseString,可是通过category 无法添加属性以及方法
由于category 中需要用到reposne 中的数据,所以也无法直接给 NSObject 添加category,各位大大,是否有好的解决方案
PHP中文网2017-04-18 09:08:28
NSURLSessionTask 确实加不了 category,有点类似『不能继承』的问题。一般遇到这种问题有几种思路,你看看对应你的业务能不能用:
组合代替继承,定义一个 NSURLSessionTaskWrapper,里面有一个属性是那个 task,另外想加什么别的属性和方法都可以;用到 task 的部分可以直接用 wrapper.task
,也可以写方法透传,比如wrapper.task
,也可以写方法透传,比如
- (NSInteger)someProperty {
return self.task.someProperty;
}
当然,你控制得了自己的代码用wrapper.task
rrreee
wrapper.task
,但控制不了系统的代码,所以我不知道你的业务用不用得了。以上是几种常用的思路,你可以看看具体到你的业务是否适用~🎜
ringa_lee2017-04-18 09:08:28
2016年06月03日21:29:15 更新
因为 http://stackoverflow.com/a/35359533 提到的原因,所以将扩展添加到
NSObject
类因为某些原因,请不要在文件中只添加一个分类。详细原因可以移步到 https://developer.apple.com/library/mac/qa/qa1490/_index.html 查看。
@interface NSObject (sun)
- (void)_sun_setResponseString:(NSString *)responseString;
- (NSString *)_sun_responseString;
@end
@implementation NSObject (sun)
static int _sun_ResponseStringKey;
- (void)_sun_setResponseString:(NSString *)responseString {
objc_setAssociatedObject(self, &_sunResponseStringKey, responseString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)_sun_responseString {
return objc_getAssociatedObject(self, &_sunResponseStringKey);
}
@end
[_sessionManager setDataTaskDidReceiveDataBlock:^(NSURLSession *_Nonnull session, NSURLSessionDataTask *_Nonnull dataTask, NSData *_Nonnull data) {
[dataTask _sun_setResponseString:[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]];
NSLog(@"%@", [dataTask _sun_responseString]);
}];
题主可以看看上面的代码是否可以实现需求。