0

困っているようです。何らかの理由で、NSURLSessionTaskオブジェクトのクラス タイプを確認しようとすると、まったく機能しません。それらのtaskDescriptionプロパティを確認すると、タスクを開始する前にそれらを設定すると、もちろん機能します。以下のコードが機能しない理由を知りたいだけです。提供されたヘルプに感謝します!

- (void)uploadIt
{
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    defaultConfigObject.timeoutIntervalForResource = 15.0;
    defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;

    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    NSURLSessionUploadTask *uploadTask = [defaultSession uploadTaskWithRequest:someRequest fromData:body];
    [uploadTask resume];
}  

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    if (self.uploadResponseData)
    {
        NSDictionary *d = [NSJSONSerialization JSONObjectWithData:self.uploadResponseData options:kNilOptions error:nil];
        NSLog(@"Dict: %@",d);
    }

    if ([task isKindOfClass:[NSURLSessionDownloadTask class]])
    {
        // Not called
    }
    else if ([task isKindOfClass:[NSURLSessionUploadTask class]])
    {
        // Not called
    }
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    if (!self.uploadResponseData)
    {
        self.uploadResponseData = [NSMutableData dataWithData:data];
    }
    else
    {
        [self.uploadResponseData appendData:data];
    }
}
4

2 に答える 2

4

これに関する私の経験は、 app-in-the-background NSURLSessionTasks のコンテキストで行われました。これらはディスクにシリアル化され、デーモンが関与しています。私の経験では、クラスベースのフィナリングはそのコンテキストではうまく機能しませんでした。

特に、 をサブクラス化しようとしNSURLSessionTaskましたが、呼び出しで返されたの-didComplete:...はそのサブクラスのインスタンスではありませんでした。

私はNSURLSessionTaskファサード、または「クラスクラスター」の一部と考えるようになり、それについてもっと注意しようとしました。

タスクを特定のタイプとしてマークする必要がある場合は、好きなものを.description. 情報がバックグラウンドのシリアル化にうまく耐えていることを確認できます。

于 2014-08-22T16:00:53.330 に答える