如何等待完成dataTaskWithRequest?

问题描述:

我该如何等待dataTaskWithRequest的完成?网络抓取完成后,我需要执行一些任务。如何等待完成dataTaskWithRequest?

- (void) loginRequest:(NSString*) username withPassword:(NSString *) password callback:(void (^)(NSError *error, BOOL success))callback 
{ 
    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request 
                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){ 
     if (error) { 
      // Handle error, optionally using 
      callback(error, NO); 
     } 
     else { 
      callback(nil, YES); 
     } 
    }]; 

    [dataTask resume]; 
} 

调用此方法像这样:

[self loginRequest:@"myUsername" password:@"password" callback:^(NSError *error, BOOL success) { 
    if (success) { 
     NSLog(@"My response back from the server after an unknown amount of time"); 
    } 
    else { 
     NSLog(@"%@", error); 
    } 
}]; 

让刚做dataTaskWithRequest完成块任务。 直到您可以显示活动指示符以阻止用户触摸屏幕上的任何内容为止。

例子:

activityIndicator.startAnimating() 

let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
    activityIndicator.stopAnimating() 
    // do your stuff here 

}); 

我认为,这种方法是类

NSURLSessionDataTask *task = [defaultSession dataTaskWithRequest:request 
               completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) 
{ 
    // code after completion of task 
}]; 
[task resume]; 

内明显如果你真的需要同步请求时,你可以使用信号灯

我已在NSURLSession上实施了一个小类别来提供此功能。

.H文件:

@import Foundation.NSURLSession; 

@interface NSURLSession (Additions) 

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error; 

@end 

.M文件:

@implementation NSURLSession (Additions) 

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse *__autoreleasing *)responsePointer error:(NSError *__autoreleasing *)errorPointer 
{ 
    dispatch_semaphore_t semaphore; 
    __block NSData *result = nil; 

    semaphore = dispatch_semaphore_create(0); 

    void (^completionHandler)(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error); 
    completionHandler = ^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) 
    { 
     if (errorPointer != NULL) 
     { 
      *errorPointer = error; 
     } 

     if (responsePointer != NULL) 
     { 
      *responsePointer = response; 
     } 

     if (error == nil) 
     { 
      result = data; 
     } 

     dispatch_semaphore_signal(semaphore); 
    }; 

    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:completionHandler] resume]; 

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 

    return result; 
} 

@end 
+0

这是正确的做法。 –

+0

不幸的是,这是崩溃* errorPointer =错误;我无法使用它。 –

+0

@AlexZavatone你能告诉我你如何调用这个方法吗?具体如何声明错误的指针 –