私は、カスタム作成したNSURLSessionDownloadTaskは、名前のVJSessionTaskをし、私はちょうどのようないくつかのカスタム物事追加したタイプ(列挙型)およびカスタムオブジェクト(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
それから私は理解できないか、それを行う方法がわからないのであなたのところに来ます...よろしくお願いします;)
残念ながら、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;
}
詳細については、この投稿を参照してください
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加