2014-04-10 35 views
0

我有一個小問題,我的應用程序。我想發送一些http請求異步到服務器。我創建這個方法:如何發送異步http後 - ios

- (void)sendHTTPRequest:(NSString *)urlString type:(NSString *)type idNegozio:(NSNumber *)idNegozio { 

    self.negozi = [[NSMutableArray alloc] init]; 
    NSData *jsonData; 
    NSString *jsonString; 

    if ([type isEqualToString:@"shops"]) { 

     self.reqNeg = YES; 
     self.reqApp = NO; 

...

jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:0 error:nil]; 
    jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; 



    else if ([type isEqualToString:@"appointments"]) 
    { 
     [self.loadingIconApp startAnimating]; 

     self.reqNeg = NO; 
     self.reqApp = YES; 

...

  jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:0 error:nil]; 
      jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; 

    NSString *requestString = [NSString stringWithFormat:urlString]; 
     NSURL *url = [NSURL URLWithString:requestString]; 
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30]; 
    [urlRequest setHTTPMethod:@"POST"]; 
    [urlRequest setHTTPBody: jsonData]; 

    NSURLConnection * conn = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 

    [conn start]; 

}

,我用這個方法來連接:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    self.responseData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [self.responseData appendData:data]; 
} 

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection 
        willCacheResponse:(NSCachedURLResponse*)cachedResponse { 
    return nil; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    if (self.reqNeg == YES) { 
     //here use the responseData for my first http request 
    } 

    if (self.reqApp == YES) { 

     //here use the responseData for second http request 
    } 


} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 

} 

但以這種方式只有第一個連接工作,我可以使用responseData。雖然,如果我嘗試發送其他http請求,方法connectionDidFinishLoading也不起作用和其他方法。 任何人有一個想法?

+0

你康恩對象只是一個局部變量,你應該做它是一個類的成員變量。你想同時發送東西嗎?爲每個同時發送的東西使用單獨的NSURLConnection,或者使用一個NSURLConnection,但只能將一個接一個發送。如果您在第一次發送完成之前多次調用sendHTTPRequest,則您的代碼將每次都用新的覆蓋前一個NSURLConnection對象 – Gruntcakes

+0

我已經一個接一個地發送請求。我相信第一個請求會成功。但第二個請求似乎沒有啓動 – Alex

回答

0

你的代碼對我來說很不錯。這裏是我的想法:

你確定你的第二個NSURLConnection正在創建和發送? 也許它永遠不會被髮送。

您是否打電話給sendHTTPRequest:type:idNegozio:使用不同類型的方法,而您的第二個連接仍然發送出去?
您沒有在發送函數的開頭檢查以確保您尚未發送連接。也許你的旗幟正在交換中。

您的didFinish方法中的if語句應該可能與其他語句結合使用。以防萬一您想在處理「負面」連接後觸發「應用」連接,您不會意外地通過並嘗試處理響應兩次。

另外,除非在構造函數中將NO傳遞給startImmediately:參數,否則不必在NSURLConnection上顯式調用'start'。這應該不會引起問題。

+0

謝謝你的幫助,我明白,連接不會啓動,因爲有這個錯誤:域= NSURLErrorDomain代碼= -1002「不支持的URL」 – Alex

2

如果你想通過一個使用異步請求,一個你可以這樣做:

- (void)request1 { 
    NSString *requestString = @"your url here"; 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    [NSURLConnection sendAsynchronousRequest:[[NSURLRequest alloc]initWithURL:[NSURL URLWithString: requestString]] 
            queue:queue 
         completionHandler: 
    ^(NSURLResponse *response, NSData *data, NSError *error) { 
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
    if (!error && httpResponse.statusCode >= 200 && httpResponse.statusCode <300) { 
     // call the request2 here which is similar to request 1 
     // your request2 method here 
    } 
    }]; 
} 

希望這有助於你〜謝謝〜

+0

謝謝你的幫助 – Alex