强制等待NSURLSessionDataTask完成

时间:2014-10-30 23:12:58

标签: objective-c wait nsurlsessiontask

我发送URLRequest发送尝试的登录信息,并等待来自Web服务的响应,以确定用户是否能够/无法登录。

我希望这样做的方法是让用户输入他的用户名&密码分成两个文本字段,然后按一个按钮,这将调用下面的功能。此函数将启动NSURLSessionDataTask并构造一个结构,其中包含登录的布尔成功/失败,以及带有相应错误消息的NSString(如果有)。

问题是我的函数在我的NSURLSessionDataTask's完成块完成执行之前返回结构。有没有办法让我强迫我的程序等到这个任务超时或完成?或者,我可以将完成块的执行推送到主线程&在函数返回之前?

谢谢!如果我需要做出任何澄清,请告诉我!

(另外,我看到一些类似的问题在StackOverflow周围传播,提到GCD。这是一个矫枉过正的解决方案吗?这些问题似乎都没有谈论完全相同的事情,或者在高于我的水平上这样做目前的理解。我对Objective-C仍然很新。

- (struct RequestReport) sendLoginRequest: (NSString*) username withPassword:  (NSString *) password

...(创建请求和设置HTTP正文)

NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){

    NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData: data options:0 error:nil];

    success = (BOOL)jsonObject[@"success"];
    statusText = (NSString *) jsonObject[@"errors"];

}];

[dataTask resume];

struct RequestReport rr;
rr.status = statusText;
rr.success = success;

return rr;

1 个答案:

答案 0 :(得分:4)

您的方法应如下所示:

- (void) sendLoginRequest:(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
        }
        else {
           callback(error, YES);
       }
  }];

    [dataTask resume];

}

像这样调用此方法:

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

有关块的更多信息,请参阅Apple's Programming with Objective-C;有关如何声明块的信息,请参见fuckingblocksyntax.com