2015-07-04 15 views
9

Ich habe meine eigene Klasse http Anrufe, aber jetzt in iOS9 diese Methode veraltet zu machen:Veraltet: 'sendAsynchronousRequest: Warteschlange: completionHandler:' in iOS9

[NSURLConnetion sendAsynchronousRequest:queue:completionHandler:]

Ich versuche, die neu zu testen ein [NSURLSession dataTaskWithRequest:completionHandler:]

aber Xcode geben einen Fehler, weil es diese Methode nicht gefunden.

Xcode Compiler-Warnung mit veralteter Linie:

'sendAsynchronousRequest:queue:completionHandler:' is deprecated: first deprecated in iOS 9.0 - Use [NSURLSession dataTaskWithRequest:completionHandler:] (see NSURLSession.h 

Fehler bei der neuen Methode:

No known class method for selector 'dataTaskWithRequest:completionHandler:' 

Methode:

-(void)placeGetRequest:(NSString *)action withHandler:(void (^)(NSURLResponse *response, NSData *data, NSError *error))ourBlock { 

    NSString *url = [NSString stringWithFormat:@"%@/%@", URL_API, action]; 


    NSURL *urlUsers = [NSURL URLWithString:url]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:urlUsers]; 

    //[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:ourBlock]; 
    [NSURLSession dataTaskWithRequest:request completionHandler:ourBlock]; 
} 

Jede Idee?

Antwort

16

dataTaskWithRequest:completionHandler: ist eine Instanzmethode, keine Klassenmethode. Sie müssen entweder eine neue Sitzung konfigurieren oder verwenden Sie die geteilte Verantwortung:

[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:ourBlock]; 
+0

Es läuft :) Aber, ist es notwendig oder empfohlen, eine bestimmte Sitzung zu konfigurieren? – EnriMR

+1

@EnriMR Hängt von Ihrem Fall ab. Da Sie bis jetzt "NSURLConnection" verwendet haben, können Sie die freigegebene Sitzung verwenden. Apple verwendet es intern für 'NSURLConnection' seit iOS 7. –

+0

Können Sie genauer angeben, welche Klasse für die Konfiguration einer neuen Sitzung verwendet werden soll? –

5
[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) 
{ 
// Block Body 
}]; 
+1

hast du nicht einfach Leo Natans Antwort kopiert? – slxl

1
let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in 

// Code 

} 
task.resume() 
+0

Die Frage ist markiert "Objective-C", aber dieser Code ist in Swift ... –

1

Wenn Sie die AFNetworking Bibliothek verwenden, können Sie eine Sitzung verwenden können und dann einrichten Anfragen zu unterstützen, der Hintergrund. Mit diesem Ansatz löste ich zwei Probleme:

1) AFNetworking Methode

nicht veraltet ist

2) wird die Anfrage Verarbeitung auch wenn die Anwendung zwischen dem Staat Hintergrund

getan werden, ich hoffe, es zu ähnlichen Problemen hilft . Dies ist eine Alternative.

-(void) pingSomeWebSite { 

    NSString* url = URL_WEBSITE; // defines your URL to PING 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setHTTPMethod:@"GET"]; 
    [request setURL:[NSURL URLWithString:url]]; 
    request.timeoutInterval = DEFAULT_TIMEOUT; // defines your time in seconds 

    NSTimeInterval today = [[NSDate date] timeIntervalSince1970]; 
    NSString *identifier = [NSString stringWithFormat:@"%f", today]; 

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier]; 
    sessionConfig.timeoutIntervalForResource = DEFAULT_TIMEOUT_INTERVAL; // interval max to background 

    __block AFURLSessionManager *manager = [[AFURLSessionManager alloc] 
              initWithSessionConfiguration: 
              sessionConfig]; 

    NSURLSessionTask *checkTask = [manager dataTaskWithRequest:request 
              completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 

     NSLog(@"- Ping to - %@", URL_WEBSITE); 

     NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; 
     dispatch_async(dispatch_get_main_queue(), ^(){ 

      [manager invalidateSessionCancelingTasks:YES]; 

      // LOGIC FOR RESPONSE CODE HERE 
     }); 
    }]; 

    [checkTask resume]; 
} 
Verwandte Themen