2014-10-30 82 views
0

我正在发送试图登录信息,并等待来自Web服务的响应URLRequest找出如果用户能/不能登录。队等待NSURLSessionDataTask完成

我希望的方式做到这一点是通过在他的&用户名密码用户类型分为两个文本字段,然后按下一个按钮,这将调用下面的函数。该函数将启动一个NSURLSessionDataTask和构建结构用布尔成功/失败的登录并与相应的错误消息的NSString(如果有的话)。

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

谢谢!请让我知道是否有任何澄清我需要做! (另外,我看到了一些类似的问题,这些问题围绕着提到GCD的StackOverflow进行传播,这是否是一种矫枉过正的解决方案?这些问题似乎都不是在谈论完全相同的事情,或者在高于我目前的理解,我还是很新的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

对于这种类型的问题的典型的设计模式是通过当任务返回并显示在平均时间的装载指示器时执行的回调块。该方法应该是无效的,并且回调块在NSURLSessionDataTask的回调中执行。 – DBoyer 2014-10-30 23:16:09

+0

哦,我讨厌写更多的方法:PI希望有另一种解决方案,尤其是因为我的程序确实有效地以“块”,直到用户登录出于安全原因,没有提供给非登录功能用户。 – 13rave 2014-10-30 23:17:54

+0

哦,等一下,你不是要写另一种方法。回调块?所以就像传入一个委托函数(不知道它在Objective-c中称为什么)作为登录函数的参数? – 13rave 2014-10-30 23:19:10

回答

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"; 
    } 
} 

对块多阅读和fuckingblocksyntax.com如何申报块见Apple's Programming with Objective-C

+0

谢谢;我一直以完全错误的方式思考这个问题。我会考虑回调。 – 13rave 2014-10-30 23:24:48

+0

我对这里的语法有点困惑。 – 13rave 2014-10-30 23:25:58

+0

(哎呀,我不是故意按enter键。) (无效(^)(NSArray中*对象))回调 ^什么的NSArray *的对象? – 13rave 2014-10-30 23:26:27