我发送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;
答案 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。