NSURLSessionDownloadTaskをカスタムNSURLSessionDownloadTask(継承)にキャストするにはどうすればよいですか?

ケロルモップ

私は、カスタム作成した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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ