如何在nsurlconnection完成之前暂停程序?

时间:2013-06-29 21:00:56

标签: objective-c nsurlconnection objective-c-blocks

我知道有人问这个,但我没有找到满意的答案。我有一个方法可以通过我发送所有的URLRequests。当方法完成时,我将请求的响应作为字符串返回。我最近在我的程序中添加了ssl。这意味着我不能再使用同步请求,因为我需要利用didReceiveAuthenticationChallenge功能,因为我的凭据目前是自签名的。程序需要来自URL的响应才能继续,以便等待响应没有损害。但是,我似乎无法找到一种方法来保持代码并在完成后继续。我可以提醒调用请求函数的原始函数但我希望程序在该调用之后立即获取。它在这些调用下面有唯一的代码,所以我不能专门研究connectionDidFinishLoading:函数,因为调用它的每个方法都是不同的。

如何暂停程序以便将nsdata从连接返回到调用它的方法?

这是一些伪代码,告诉你我的意思:

- (void) login:(NSString *)username :(NSString *)password {
     NSString *str = [NSString stringWithFormat:%@"%@:::%@",username,password];
     NSURL *url = [NSURL urlWithString:@"https://blahblahblah"];
     NSString *result = [self connectToUrl:str:url];
     if ([result isEqualToString:@"valid"]) {
           //this would be more complex in here
           NSLog(@"hooray");
     } else {
           NSLog(@"bummer");
    }
}


- (NSString *)connectToUrl:(NSURL *)url :(NSString *)str {

     NSData *FileData = [str dataUsingEncoding: NSUTF8StringEncoding];



    NSMutableData *data = [[NSMutableData alloc] initWithCapacity:100];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setHTTPMethod:@"POST"];

    //set up the rest of the request...

     ...

    connection = [NSURLConnection connectionWithRequest:request delegate:self];
   [connection start];

    //WOULD LIKE TO PAUSE HERE UNTIL COMPLETE!  THEN CONTINUE

    // received data is assigned in didReceiveData: method
    return [[[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding] autorelease];  

}

但是,我不能这样做,因为我不能让最后一行等到连接完成后......请帮助我!

非常感谢!

[R

1 个答案:

答案 0 :(得分:3)

iOS和OS X以及许多Cocoa / Cocoa触摸框架都是基于事件模型构建的。你不要暂停你的应用程序。这不是正确的方法。您需要启动连接然后继续。连接完成后,您将对该事件采取行动。

换句话说,您的login方法无法坐下来等待结果。它应该开始连接并返回。

当你得到连接的结果时,你会调用一些方法来处理登录结果。

利用块可以使这样的事情变得更容易,但还有其他方法。你只需要以线性方式停止思考这些事情。处理异步处理需要采用不同的方法。