2011-11-29 8 views
9

używam AFNetworking rejestracji nowych użytkowników, to wszystko działa ok, ale w następnym bloku mam pewne problemy:AFNetworking, AFHTTPRequestOperation blok Zakończenie wolno strzelać kod

AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:myRequest] autorelease]; 
operation.completionBlock =^{ 
    if ([operation hasAcceptableStatusCode]) { 
     NSLog(@"success"); 
     username.backgroundColor = [UIColor yellowColor]; 
    } else { 
     switch ([operation.response statusCode]) { 
      case 421:     
      { 
       NSLog(@"Username taken."); 
       username.backgroundColor = [UIColor yellowColor]; 
      } 
       break; 
      default: 
       break; 
     } 
    } 
}; 

Zasadniczo mój skrypt po stronie serwera nie niektóre sprawdzania poprawności i odpala kod statusu HTTP (wiem, że 421 nie jest prawidłowy). Dzięki temu wiem, co poszło nie tak na serwerze, działa to dobrze.

Moim problemem jest to, że po otrzymaniu odpowiedzi od razu odpala NSLog(@"success"); lub NSLog(@"Username taken.");, ale inne kody odpalą się kilka sekund później.

Czy ktoś może rzucić światło na to, proszę?

+0

Znalazłem rozwiązanie tego problemu. – iamsmug

+1

Czy możesz to opublikować jako odpowiedź, więc inne osoby z tym samym problemem mogą zobaczyć, jak to rozwiązałeś? – JosephH

+0

Tak, zrobimy, musieliśmy poczekać 8 godzin, opublikujemy wkrótce. – iamsmug

Odpowiedz

32

Oto rozwiązanie mojego problemu, to jest o wiele lepiej i cholernie dużo szybciej:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    NSLog(@"success: %@", operation.responseString); 

    [SVProgressHUD dismissWithSuccess:@"Sucess!" afterDelay:2]; 
    [self saveContinue:operation.responseString]; 


} 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"error: %@", operation.responseString); 

} 
]; 

Mam nadzieję, że to pomoże ludziom.

+0

To pomogło mi dużo! Wyeliminowano opóźnienie po ukończeniu bloku. –

+0

Jak mogę uzyskać zawartość w bloku "niepowodzenie"? Otrzymałem status HTTP 400 w bloku niepowodzeń z zawartością odpowiedzi. – TheFox

+0

operation.responseString by to zrobić. Jedynym problemem jest w moim przypadku, że czasami responseString jest zerowy (nawet gdy wiem, że dane zostały odesłane) – elsurudo

0

Moje rozwiązanie dla HTTP POST było to

NSData *data = [self.postBody dataUsingEncoding:NSUTF8StringEncoding]; 
      NSURL *url = [NSURL URLWithString:self.requestUrl]; 
      NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
      [request setURL:url]; 
      [request addValue:@"application/octet-stream" forHTTPHeaderField: @"Content-Type"]; 
      [request addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"]; 
      [request setHTTPMethod:@"POST"]; 
      NSMutableData *requestBody = [NSMutableData data]; 
      [requestBody appendData:data]; 
      [request setHTTPBody:requestBody]; 
      AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
      operation.responseSerializer = [AFJSONResponseSerializer serializer]; 
      operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; 
      [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
       NSInteger statusCode = operation.response.statusCode; 
       [self requestFinished:responseObject andStatusCode:statusCode]; 
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       [self requestFailed:error]; 
      }]; 
      [[self.requestManager operationQueue] addOperation:operation]; 

      [AFHTTPRequestOperation batchOfRequestOperations:[NSArray arrayWithObjects:operation, nil] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { 
      } completionBlock:^(NSArray *operations) { 
      }]; 

że kolejkuje pojedynczą operację na kierownika operacji w tym przypadku.