首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查发生了哪种NSURLSessionTask

检查发生了哪种NSURLSessionTask
EN

Stack Overflow用户
提问于 2014-06-30 23:47:36
回答 2查看 1.8K关注 0票数 0

我好像遇到了麻烦。由于某些原因,如果我试图检查我的NSURLSessionTask对象的类类型,它根本就不能工作。如果我检查它们的taskDescription属性,当然,如果在启动任务之前设置它们,这是可行的。我只想知道为什么下面的代码对我不起作用。我很感谢你的帮助!

代码语言:javascript
复制
- (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];
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-22 16:00:53

我的经验是在后台应用程序NSURLSessionTask的上下文中,这些文件被序列化到磁盘上,涉及到一个deamon,而我的经验是,任何基于类的欺骗在这种情况下都不太有效。

特别是,我试图对NSURLSessionTask进行子类处理,但是在-didComplete:...调用中返回的不是该子类的实例。

我开始把NSURLSessionTask看作是一个外观,或者是一个“类集群”的一部分,并试图对它更加小心。

如果需要将任务标记为特定类型,则可以在.description中存储任何您喜欢的内容。我可以确认信息生存的背景序列化很好。

票数 4
EN

Stack Overflow用户

发布于 2014-07-02 17:02:50

我无法从你发布的代码中复制这个问题。我从您的代码中创建了一个最小的示例,只需从标准Xcode模板创建一个单视图应用程序,然后使用它作为视图控制器:

查看控制器h:

代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionTaskDelegate>

@end

视图控制器m:

代码语言:javascript
复制
#import "ViewController.h"

@interface ViewController ()


@end

@implementation ViewController

 1. (void)viewDidLoad {
    [super viewDidLoad];
    [self uploadIt];
}

 2. (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

 3. (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;

    NSURLRequest* someRequest = [NSURLRequest requestWithURL: [NSURL URLWithString:@"http://example.com"]];
    NSData* body = [@"Fake body" dataUsingEncoding:NSUTF8StringEncoding];

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

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    NSLog(@"Completed.");

    if ([task isKindOfClass:[NSURLSessionDownloadTask class]])
    {
        NSLog(@"The task was a download task");
    }
    else if ([task isKindOfClass:[NSURLSessionUploadTask class]])
    {
        NSLog(@"The task was an upload task");
    }
}
@end

结果如下:

2014-07-02 17:57:28.002 24500545_nsurlsession_classes22470:1250475完成.2014-07-02 17:57:48.631 24500545_nsurlsession_classes22470:1250475任务是上传任务

(你确定你的记录是正确的吗?如果在委托方法中设置断点并逐步遍历代码,您会看到什么?p task用11分贝告诉你什么?)

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

https://stackoverflow.com/questions/24500545

复制
相关文章

相似问题

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