Ios 正在检查发生了哪种NSURLSessionTask

Ios 正在检查发生了哪种NSURLSessionTask,ios,objective-c,nsurlsession,nsurlsessiontask,nsurlsessionuploadtask,Ios,Objective C,Nsurlsession,Nsurlsessiontask,Nsurlsessionuploadtask,我好像遇到麻烦了。出于某种原因,如果我尝试检查我的NSURLSessionTask对象的类类型,它根本不起作用。如果我检查它们的tasksdescription属性,如果我在启动任务之前设置它们,这当然有效。我只是想知道为什么下面的代码不适合我。我感谢任何提供的帮助 - (void)uploadIt { NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionC

我好像遇到麻烦了。出于某种原因,如果我尝试检查我的
NSURLSessionTask
对象的类类型,它根本不起作用。如果我检查它们的
tasksdescription
属性,如果我在启动任务之前设置它们,这当然有效。我只是想知道为什么下面的代码不适合我。我感谢任何提供的帮助

- (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];
    }
}

我无法从您发布的代码中复制该问题。我从您的代码中做了一个简单的示例,仅从标准Xcode模板创建一个视图应用程序,然后将其用作视图控制器:

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionTaskDelegate>

@end
结果如下:

2014-07-02 17:57:28.002 24500545课程[22470:1250475]已完成。 2014-07-02 17:57:48.631 24500545课程[22470:1250475]该任务是上传任务


(您确定您的日志记录正确吗?如果您在委派方法中设置断点并逐步执行代码,您会看到什么?
p task
在lldb中告诉您什么?

我无法从您发布的代码中重现问题。我从您的代码中做了一个简单的示例,仅从标准Xcode模板创建一个视图应用程序,然后将其用作视图控制器:

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionTaskDelegate>

@end
结果如下:

2014-07-02 17:57:28.002 24500545课程[22470:1250475]已完成。 2014-07-02 17:57:48.631 24500545课程[22470:1250475]该任务是上传任务


(您确定您的日志记录正确吗?如果您在委派方法中设置断点并逐步执行代码,您会看到什么?
p任务在lldb中告诉您什么?

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

特别是,我试图将
NSURLSessionTask
子类化,但是
-didComplete:…
调用中返回的不是该子类的实例

我开始将
NSURLSessionTask
视为一个门面,或“类集群”的一部分,并试图对此更加小心


如果需要将任务标记为特定类型,可以在
.description
中存储所需的内容。我可以确认信息在后台序列化中很好地保存了下来。

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

特别是,我试图将
NSURLSessionTask
子类化,但是
-didComplete:…
调用中返回的不是该子类的实例

我开始将
NSURLSessionTask
视为一个门面,或“类集群”的一部分,并试图对此更加小心


如果需要将任务标记为特定类型,可以在
.description
中存储所需的内容。我可以确认info在后台序列化中很好地保存下来。

对于初学者来说,您的任务是什么样的类?在上面的代码中,如果您的“未调用”部分是NSURLDataTask,则不调用它是完全有效的。
NSURLSessionDownload
&上载任务是
NSURLSessionDataTask
的子类,但是
NSURLSessionDataTask
NSURLSessionTask
的子类,所以我不明白为什么这不起作用。我是不是遗漏了什么?我想问您期望的任务是什么类型的类,因为如果它是NSURLDataTask,这意味着它既不是NSURLSessionPloadTask,也不是NSURLSessionDownloadTask,这就解释了为什么您的代码不工作。我想你刚才也是这么说的。NSURLSessionDataTask是NSURLSessionTask的一个子类,据我所知,与我的观点没有任何关系……那么,如何两次调用isKindOfClass isKindOfClass来获得超类?我可以再问一次:您试图检测的任务是什么类型的类?首先,您的任务是什么类型的类?在上面的代码中,如果您的“未调用”部分是NSURLDataTask,则不调用它是完全有效的。
NSURLSessionDownload
&上载任务是
NSURLSessionDataTask
的子类,但是
NSURLSessionDataTask
NSURLSessionTask
的子类,所以我不明白为什么这不起作用。我是不是遗漏了什么?我想问您期望的任务是什么类型的类,因为如果它是NSURLDataTask,这意味着它既不是NSURLSessionPloadTask,也不是NSURLSessionDownloadTask,这就解释了为什么您的代码不工作。我想你刚才也是这么说的。NSURLSessionDataTask是NSURLSessionTask的一个子类,据我所知,与我的观点没有任何关系……那么你如何调用isKindOfClass isKindOfClass两次以获得超类?我可以再问一次:你试图检测的任务是什么类型的类?嗯,如果我做一个裸体项目,它当然可以工作。真奇怪!事实上我还是有点麻烦。如果启动NSURLSessionPloadTask,则仍会调用
([task isKindOfClass:[NSURLSessionDownloadTask class]])
的If语句。WeirdIs你的代码和你原来的帖子中的代码一样,还是已经改变了?(如果它是相同的,并且“If”语句中没有任何内容,那么您如何检查它是否被执行?想知道您是否看到由于优化或其他原因而产生的某种奇怪的结果…)嗯,当然,如果我做一个基本的项目,它是有效的。真奇怪!事实上我还是有点麻烦。如果启动NSURLSessionPloadTask,则仍会调用
([task isKindOfClass:[NSURLSessionDownloadTask class]])
的If语句。WeirdIs是你的同事吗