Maison > Questions et réponses > le corps du texte
项目从AFN 2.0 迁移到 3.0,因为代码历史问题,需要通过NSURLSessionTask 获取到responseString,可是通过category 无法添加属性以及方法
由于category 中需要用到reposne 中的数据,所以也无法直接给 NSObject 添加category,各位大大,是否有好的解决方案
PHP中文网2017-04-18 09:08:28
NSURLSessionTask ne peut en effet pas ajouter de catégorie, ce qui est un peu similaire au problème de "ne peut pas être hérité". Généralement, il existe plusieurs idées lorsque vous rencontrez ce genre de problème. Vous pouvez voir si cela peut être utilisé pour votre entreprise :
La combinaison remplace l'héritage, définissez un NSURLSessionTaskWrapper, qui a un attribut qui est la tâche, et vous pouvez ajouter tous les autres attributs et méthodes que vous souhaitez utiliser wrapper.task
directement pour la partie qui utilise la tâche, ou vous pouvez ; écrivez une méthode pour le transmettre. Par exemple
- (NSInteger)someProperty {
return self.task.someProperty;
}
Bien sûr, vous pouvez contrôler votre propre code wrapper.task
, mais vous ne pouvez pas contrôler le code du système, donc je ne sais pas si vous pouvez l'utiliser pour votre entreprise.
Utilisez le runtime pour ajouter des attributs et des méthodes. Cela peut résoudre le problème ci-dessus de "ne pas pouvoir contrôler le code du système". Après avoir utilisé le runtime pour le modifier, cette classe aura ces attributs et méthodes aux yeux du système. Mais je ne peux pas ajouter de catégorie. Je ne sais pas si le runtime fonctionne.
Stockage externe. Découvrez si la sessionTask a un attribut pouvant être utilisé comme identifiant unique, puis écrivez une classe SessionTaskManager. Les méthodes nouvellement ajoutées sont placées dans cette classe de gestionnaire. Pour les attributs nouvellement ajoutés, le gestionnaire peut enregistrer un dictionnaire avec l'identifiant de. la sessionTask comme clé. Plus précisément, l'attribut est une valeur et, si nécessaire, il est accessible en fonction de l'identifiant.
Voici plusieurs idées couramment utilisées. Vous pouvez voir si elles sont applicables à votre entreprise~
.ringa_lee2017-04-18 09:08:28
Mis à jour à 21:29:15, le 3 juin 2016
Ajout d'une extension à
pour les raisons mentionnées par http://stackoverflow.com/a/35359533NSObject
classPour certaines raisons, veuillez ne pas ajouter une seule catégorie au fichier. Les raisons détaillées peuvent être consultées sur 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]);
}];
Le questionneur peut voir si le code ci-dessus peut répondre à l'exigence.