2015-08-06 1 views
2

Fondamentalement, l'en-tête de la question explique tout. J'ai essayé beaucoup de choses, mais ça ne marche pas.La méthode d'appel de la catégorie donne "Erreur de sélecteur non reconnue" dans iOS 7.1, mais dans 8.4, c'est OK

J'ai la catégorie qui va NSURLSession, qui gère le serveur et les erreurs réseau

- (NSURLSessionDataTask *) 
dataTaskHandlingErrorsWithRequest:(NSURLRequest *)request 
       completionHandler:(void (^)(NSData *))completionHandler { 
    return 
     [self dataTaskWithRequest:request 
       completionHandler:^(NSData *data, NSURLResponse *response, 
            NSError *error) { 
       if (!error && response && 
        [response isKindOfClass:[NSHTTPURLResponse class]]) { 
        NSHTTPURLResponse *resp = (NSHTTPURLResponse *)response; 
        if (resp.statusCode/100 == 2) { 
        completionHandler(data); 
        } else { 
        // Wrong status code from server. 
        NSNotificationCenter *center = 
         [NSNotificationCenter defaultCenter]; 
        [center postNotificationName:kPANotifiNameServerStatusError 
              object:self 
             userInfo:@{ 
              @"response" : resp 
             }]; 
        NSLog(@"Wrong status code"); 
        completionHandler(nil); 
        } 
       } else { 
        // Something wrong with network. 
        NSNotificationCenter *center = 
         [NSNotificationCenter defaultCenter]; 
        [center postNotificationName:kPANotifiNameNetworkError 
             object:self 
             userInfo:@{ 
             @"error" : error ? error : [NSNull null] 
             }]; 
        NSLog(@"Internet connection problem."); 
        completionHandler(nil); 
       } 
       }]; 
} 

Et voici où je l'appeler de:

- (void)authenticateWithHandler:(AuthHandler)handler { 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionTask *task = 
     [session dataTaskHandlingErrorsWithRequest:self.request 
           completionHandler:^(NSData *data) { 
           if (data) { 
            BOOL suc = [self handleResponse:data]; 
            handler(suc); 
           } else { 
            handler(NO); 
           } 
           }]; 
    [task resume]; 
} 

Ainsi, sur iOS 7.1, si j'appelle cette méthode, il jette

2015-08-06 15:29:50.973 MyApp[2618:607] -[__NSCFURLSession dataTaskHandlingErrorsWithRequest:completionHandler:]: unrecognized selector sent to instance 0x7871bf40 
2015-08-06 15:29:50.976 MyApp[2618:607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFURLSession dataTaskHandlingErrorsWithRequest:completionHandler:]: unrecognized selector sent to instance 0x7871bf40' 

Mais sur iOS 8 cela fonctionne. J'ai vérifié les sources de compilation, tout est ok là.

+0

Je ne vois pas cette méthode dans les références ... –

+0

Comment se fait l'importation du fichier catégorie? – Larme

+0

@Larme simplement comme '#import" NSURLSession + ErrorHandlingAdditions.h "' –

Répondre

1

Pouvez-vous vérifier dans votre méthode de catégorie:

if ([self isKindOfClass:[NSURLSession class]]) { 
    NSLog(@"YES"); 
} 

Peut-être l'objet que vous essayez de le lancer sur est juste casté en NSURLSession alors qu'en fait il n'est pas ..? Juste quelques suppositions, comme je n'en ai toujours aucune idée. Je voudrais ici pointer Mattt answer, ce qui peut aider à comprendre comment cela fonctionne.