I've had similar results with backgrounded NSURLSessionUploadTask
s, which get deserialized as __NSCFURLSessionUploadTask
s during the -URLSession:task:didCompleteWithError:
delegate callback.
If I were you, I'd give up on that approach, and use composition (i.e. make the NSURLSession
an ivar in another object). If you need to store some info with the NSURLSession
, you could stuff a JSON-encoded dictionary into the .sessionDescription
.
Here's the code that I used to do that for a task:
#pragma mark - Storing an NSDictionary in NSURLSessionTask.description
// This lets us attach some arbitrary information to a NSURLSessionTask by JSON-encoding
// an NSDictionary, and storing it in the .description field.
//
// Attempts at creating subclasses or categories on NSURLSessionTask have not worked out,
// because the –URLSession:task:didCompleteWithError: callback passes an
// __NSCFURLSessionUploadTask as the task argument. This is the best solution I could
// come up with to store arbitray info with a task.
- (void)storeDictionary:(NSDictionary *)dict inDescriptionOfTask:(NSURLSessionTask *)task
{
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];
NSString *stringRepresentation = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[task setTaskDescription:stringRepresentation];
[stringRepresentation release];
}
- (NSDictionary *)retrieveDictionaryFromDescriptionOfTask:(NSURLSessionTask *)task
{
NSString *desc = [task taskDescription];
if (![desc length]) {
DDLogError(@"No description for %@", task);
return nil;
}
NSData *data = [desc dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dict = (data ? (id)[NSJSONSerialization JSONObjectWithData:data options:0 error:nil] : nil);
if (!dict) {
DDLogError(@"Could not parse dictionary from task %@, description
%@", task, desc);
}
return dict;
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…