首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将NSURLSessionDownloadTask转换为自定义NSURLSessionDownloadTask (继承)?

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

Stack Overflow用户
提问于 2014-10-13 13:50:21
回答 1查看 432关注 0票数 0

我创建了一个名为VJSessionTask的自定义VJSessionTask,我刚刚添加了一些定制的东西,比如类型(enum)和自定义对象(id)。

代码语言:javascript
复制
@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

当我这么做的时候

代码语言:javascript
复制
VJSessionTask *taskSession = (VJSessionTask *)[self.prioritySession downloadTaskWithRequest:listFileRequest];
// init taskSession with its type
taskSession.type = LS;

我知道这个错误:

代码语言:javascript
复制
-[__NSCFLocalDownloadTask setType:]: unrecognized selector sent to instance 0x1556198f0

然后我来找你,因为我不明白或者我不知道怎么做.(预先谢谢你;)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-13 14:02:32

不幸的是,NSURLSessionTasks并不严格地说是可子类的。这一点很明显,系统可以对数据任务排队并返回一个NSCFLocalDownloadTask (大概意味着该任务将从缓存返回其内容)。

这样做的最佳方法是借鉴AFNetworking的体系结构决策,并让单独的taskDelegates监视单个任务所做的所有响应。然后,当您想查找与某个任务相关的数据时,可以查询您的taskDelegates字典。每个任务都有一个唯一的标识符,您可以使用该标识符来键入字典。

在AFNetworking中,您可以看到taskDelegate的定义如下:

代码语言:javascript
复制
@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

并随后检索如下:

代码语言:javascript
复制
- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task {
    NSParameterAssert(task);

    AFURLSessionManagerTaskDelegate *delegate = nil;
    [self.lock lock];
    delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
    [self.lock unlock];

    return delegate;
}

有关更多信息,请参见这个职位

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26341628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档