如何将我的NSURLSessionDownloadTask转换为我的自定义NSURLSessionDownloadTask(继承)?

时间:2014-10-13 13:50:22

标签: objective-c inheritance casting nsurlsession

我创建了一个名为 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

然后我来找你,因为我不明白或者我不知道该怎么做... 提前谢谢你;)

1 个答案:

答案 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