2011-12-15 20 views
21

Chciałbym wiedzieć, jak uzyskać tylko wartość zwracaną 1 lub 0 .... powrót z żądania adresu URL asynchronicznie.Jak wysłać żądanie asynchronicznego adresu URL?

obecnie robię to w ten sposób:

 NSString *UTCString = [NSString stringWithFormat:@"http://web.blah.net/question/CheckQuestions?utc=%0.f",[lastUTCDate timeIntervalSince1970]]; 
     NSLog(@"UTC String %@",UTCString); 
     NSURL *updateDataURL = [NSURL URLWithString:UTCString]; 
     NSString *checkValue = [NSString stringWithContentsOfURL:updateDataURL encoding:NSASCIIStringEncoding error:Nil]; 
     NSLog(@"check Value %@",checkValue); 

to działa, jednak blokuje mój główny wątek aż dostałam odpowiedź z powrotem z adresu URL, w jaki sposób ustawić go tak, będzie to zrobić w kolejny wątek zamiast głównego wątku?

EDIT: Odpowiedź kończę upcalling mojej funkcji z tym, że działa dobrze :)

[self performSelectorInBackground:@selector(shouldCheckForUpdate) withObject:nil]; 
+5

Jak z iOS 5, można użyć '+ (void) sendAsynchronousRequest: (NSURLRequest *) kolejka życzenie (NSOperationQueue *) kolejka completionHandler: (void (^) (NSURLResponse * NSData * NSError *) Zamiast tego jest to program obsługi, który jest łatwiejszy i bardziej przejrzysty dla prostych żądań niż tworzenie obiektu delegata. Spróbuję napisać odpowiedź pokazującą tę metodę później. –

+1

@MarkAmery Byłoby miło zobaczyć twoją odpowiedź. Mam trudności ze znalezieniem prostego przykładu 'sendAsynchronousRequest'. –

Odpowiedz

28

można użyć NSURLConnection klasę

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease]; 

i obsługiwać swoją odpowiedź i błędów za pomocą metody jego delegata.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

można znaleźć realizację NSURLConnection

EDIT: Chociaż NSURLConnection jest przez Apple jest bardziej zalecany sposób wprowadzania żądania URL. Ale znalazłem bibliotekę AFNetworking bardzo oszczędną, łatwą do wdrożenia i niezawodną, ​​a zarazem prostą, jako implementację strony trzeciej. Powinieneś spróbować.

+1

której metody należy użyć, aby uzyskać wartości cookie? – kAnNaN

5

Zastosowanie NSURLConnection i na swój wniosek. Następnie można rozpocząć synchroniczne lub asynchroniczne połączenie z metod NSURLConnection za:

Ładowanie danych Synchronicznie

+ sendSynchronousRequest:returningResponse:error: 

Ładowanie danych asynchronicznie

+ connectionWithRequest:delegate: 
– initWithRequest:delegate: 
– initWithRequest:delegate:startImmediately: 
– start 

Sprawdź klasę w Apple Developer API Reference NSURLConnection.

+0

Oto link: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html – samfisher

26

spróbuj tego:

.h:

NSMutableData *responseData; 

.m:

- (void)load 
{ 
    NSURL *myURL = [NSURL URLWithString:@"http://www.example.com"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 

    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

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

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    [responseData release]; 
    [connection release]; 
    [textView setString:@"Unable to fetch data"]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"Succeeded! Received %d bytes of data",[responseData 
                length]); 
    NSString *txt = [[[NSString alloc] initWithData:responseData encoding: NSASCIIStringEncoding] autorelease]; 
} 
+0

Po prostu potrzebuję odpowiedzi 1 lub 0, czy to za dużo? – Desmond

+0

@Maulik Dodaj pokój "Smart Developers". – MinuMaster

+0

@Maulik, uratowałeś mój dzień, wielkie dzięki! – DeZigny

2

Jest przykładem na iOS Xcode dokumentacji nazywane LazyTableImages. Powoduje to asynchroniczny adres URL, a także ładowanie obrazu asynchronicznego do komórek UITableView wyświetlanych na ekranie po zakończeniu przewijania. Doskonały przykład protokołów, asynchroniczna obsługa danych itp.

3

Bezwstydnie skopiuj z https://gist.github.com/knmshk/3027474. Wszystkie kredyty idą do https://gist.github.com/knmshk.

xmlData = [[NSMutableData alloc] init]; 
NSURL *url = [NSURL URLWithString: 
@"http://forrums.bignerdranch.com/smartfeed.php?" 
@"limit=NO_LIMIT&count_limit20&sort_by=standard&" 
@"feed_type=RSS2.0&feed_style=COMPACT"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
//connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 
[NSURLConnection sendAsynchronousRequest:request 
            queue:queue 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 
          if (error) { 
           xmlData = nil; 
           NSLog(@"error:%@", error.localizedDescription); 
          } 
          [xmlData appendData:data]; 
         }]; 
Powiązane problemy