2013-06-29 48 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

相關問題