0

我正在制作一个URLRequest发送尝试登录信息并等待来自网络服务的响应以查明用户是否可以/无法登录。

我希望这样做的方法是让用户在两个文本字段中输入他的用户名和密码,然后按下一个按钮,这将调用下面的函数。此函数将启动并构造一个结构,其中包含登录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;
4

1 回答 1

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 的 Programming with Objective-Cfuckingblocksyntax.com 。

于 2014-10-30T23:20:49.970 回答