2013-06-29 43 views
0

我知道有人问过这个,但我还没有找到满意的答案。我有一种方法可以发送所有的URLRequests。当方法完成时,我将请求的响应作为字符串返回。我最近在我的程序中添加了ssl。这意味着我不能再使用同步请求,因为我需要利用didReceiveAuthenticationChallenge功能,因为我的凭证当前是自签名的。该程序需要来自URL的响应才能继续,因此在等待响应时不会造成伤害。但是,我似乎无法找到一种方法来保存代码并继续完成。我可以提醒那些调用请求函数的原始函数,但我希望程序在调用之后立即启动。而且它在这种调用下面有唯一的代码,所以我不能专注于connectionDidFinishLoading:函数,因为调用它的每个方法都是不同的。如何暂停程序,直到nsurlconnection完成?

如何暂停程序,以便我可以将连接的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]; 

} 

但很可惜,我不能这样做,因为我不能作出最后的排队等候,直到完成连接......请大家帮帮我!

非常感激!

ř

回答

3

iOS和OS X和大部分可可/可可触摸框架都是建立在一个事件模型。你不要暂停你的应用程序。这不是正确的做法。您需要开始连接,然后继续。当连接完成后,您将针对该事件采取行动。

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

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

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

+0

但是用户无论如何都无法做任何事情,直到他们登录。另外,那么我不能使连接功能一般。我需要为每次需要连接时专门编写一个不同的响应,例如每个特定情况的7500 if语句,而不是让调用它的函数处理响应?这似乎不太好 - 谢谢 – Rossi

+0

因此,显示一个活动指示器,直到登录完成。冻结你的用户界面不是要走的路。您还可以传递完成代码块或设置代理协议,以便让主叫方知道登录何时完成。 – Lance

+0

@Rossi您可以使用完成处理程序块对其进行概括。许多类具有完成块的方法。您可以实现您的代码,以便在连接完成时调用完成块。 – rmaddy

相关问题