我正在制作一个URLRequest,它发送尝试的登录信息,并等待web服务的响应,以确定用户是否可以/不能登录。
我希望这样做的方式是让用户在他的用户名和密码中输入两个文本字段,然后按下一个按钮,然后调用下面的函数。该函数将启动一个NSURLSessionDataTask,并使用登录的布尔NSURLSessionDataTask构造一个结构,并使用相应的错误消息(如果有的话)构造一个NSString。
问题是,我的函数在NSURLSessionDataTask's完成块完成执行之前返回结构。有没有办法迫使我的程序等到这个任务超时或完成?或者,我可以在函数返回之前将完成块的执行推送到主线程上吗?
谢谢!如果有什么需要澄清的地方,请告诉我!
(同时,我也看到一些类似的问题在StackOverflow周围流传,这些问题都提到了GCD。这是个过火的解决方案吗?这些问题中没有一个是在谈论完全相同的事情,或者是在一个比我目前的理解更高的水平上这样做。我对目标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;发布于 2014-10-30 23:20:49
您的方法应该如下所示:
- (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的目标C编程,如何声明块,请参见fuckingblocksyntax.com。
https://stackoverflow.com/questions/26665010
复制相似问题