我创建了一个名为 VJSessionTask 的自定义 NSURLSessionDownloadTask ,我刚刚添加了一些自定义内容,例如类型(枚举)和自定义对象(id):
@interface VJSessionTask : NSURLSessionDownloadTask
typedef enum types
{
LS, LSH, DL, UL, RM, TH
} type;
@property enum types type;
@property (strong, nonatomic) id customObject;
@property (strong, nonatomic) NSString *progressNotif;
@property (strong, nonatomic) NSString *doneNotif;
@property (strong, nonatomic) NSURL *tmpFile;
@end
当我这样做时:
VJSessionTask *taskSession = (VJSessionTask *)[self.prioritySession downloadTaskWithRequest:listFileRequest];
// init taskSession with its type
taskSession.type = LS;
我收到此错误:
-[__NSCFLocalDownloadTask setType:]: unrecognized selector sent to instance 0x1556198f0
然后我来找你,因为我不明白或者我不知道该怎么做... 提前谢谢你;)
答案 0 :(得分:0)
不幸的是,NSURLSessionTasks严格来说并不是子类。这很明显,系统可以对数据任务进行排队并返回NSCFLocalDownloadTask(可能意味着任务将从缓存中返回其内容)。
执行此操作的最佳方法是借用AFNetworking的架构决策,并使用单个taskDelegates监视单个任务的所有响应。然后,当您想要查找与任务相关的数据时,您可以查询taskDelegates的字典。每个任务都有一个唯一的标识符,您可以使用该标识符来键入字典。
在AFNetworking中,您可以看到taskDelegate的定义如下:
@interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
@property (nonatomic, weak) AFURLSessionManager *manager;
@property (nonatomic, strong) NSMutableData *mutableData;
@property (nonatomic, strong) NSProgress *progress;
@property (nonatomic, copy) NSURL *downloadFileURL;
@property (nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading;
@property (nonatomic, copy) AFURLSessionTaskCompletionHandler completionHandler;
@end
@implementation AFURLSessionManagerTaskDelegate
随后检索如下:
- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task {
NSParameterAssert(task);
AFURLSessionManagerTaskDelegate *delegate = nil;
[self.lock lock];
delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
[self.lock unlock];
return delegate;
}
有关详细信息,请参阅this post