Rumah > Soal Jawab > teks badan
项目从AFN 2.0 迁移到 3.0,因为代码历史问题,需要通过NSURLSessionTask 获取到responseString,可是通过category 无法添加属性以及方法
由于category 中需要用到reposne 中的数据,所以也无法直接给 NSObject 添加category,各位大大,是否有好的解决方案
PHP中文网2017-04-18 09:08:28
NSURLSessionTask sememangnya tidak boleh menambah kategori, yang agak serupa dengan masalah "tidak boleh diwarisi". Secara umumnya, terdapat beberapa idea apabila menghadapi masalah seperti ini Anda boleh melihat sama ada ia boleh digunakan untuk perniagaan anda:
Gabungan menggantikan warisan, tentukan NSURLSessionTaskWrapper, yang mempunyai atribut iaitu tugasan dan anda boleh menambah sebarang atribut dan kaedah lain yang anda mahukan, anda boleh menggunakan wrapper.task
terus untuk bahagian yang menggunakan tugasan itu, atau anda boleh tulis kaedah untuk lulus sebagai contoh
- (NSInteger)someProperty {
return self.task.someProperty;
}
Sudah tentu, anda boleh mengawal kod anda sendiri wrapper.task
, tetapi anda tidak boleh mengawal kod sistem, jadi saya tidak tahu sama ada anda boleh menggunakannya untuk perniagaan anda.
Gunakan masa jalan untuk menambah atribut dan kaedah. Ia boleh menyelesaikan masalah di atas iaitu "tidak dapat mengawal kod sistem". Selepas menggunakan masa jalan untuk mengubah suainya, kelas akan mempunyai atribut dan kaedah ini di mata sistem. Tetapi saya tidak boleh menambah kategori Saya tidak tahu sama ada masa jalan berfungsi.
Storan luaran. Ketahui jika sessionTask mempunyai atribut yang sesuai untuk digunakan sebagai id unik, dan kemudian tulis kelas SessionTaskManager Kaedah yang baru ditambah diletakkan dalam kelas pengurus ini Untuk atribut yang baru ditambah, pengurus boleh menyimpan kamus dengan id sessionTask sebagai kunci Secara khusus Atribut adalah nilai, dan apabila diperlukan, ia diakses berdasarkan id.
Di atas ialah beberapa idea yang biasa digunakan. Anda boleh lihat jika ia boleh digunakan untuk perniagaan anda~
ringa_lee2017-04-18 09:08:28
Dikemas kini pada 21:29:15, 3 Jun 2016
Menambahkan sambungan pada
atas sebab yang disebut oleh http://stackoverflow.com/a/35359533NSObject
kelasAtas sebab tertentu, sila jangan tambahkan hanya satu kategori pada fail. Sebab terperinci boleh dilihat di 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]);
}];
Penyoal boleh melihat sama ada kod di atas boleh mencapai keperluan.