2011-11-29 52 views
9

我使用AFNetworking註冊新用戶,這一切工作正常,但下面的塊上我有一些問題:AFNetworking,AFHTTPRequestOperation完成塊慢火碼

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; 
     } 
    } 
}; 

基本上,我在我的服務器端腳本做一些驗證並返回一個HTTP狀態碼(我知道421不是有效的)。這使我能夠知道服務器上出了什麼問題,這很好。

我的問題是,當響應回來時,它直接觸發NSLog(@"success");NSLog(@"Username taken.");,但其他任何代碼都會在幾秒鐘後觸發。

任何人都可以擺脫這一點嗎?

+0

我已經找到了解決這個問題的方法。 – iamsmug

+1

你可以將它作爲答案張貼嗎,所以其他有同樣問題的人可以看到你是如何解決它的? – JosephH

+0

是的,不得不等待8個小時,很快就會發布。 – iamsmug

回答

32

這裏是解決我的問題,這是好多了,有很多的地獄更快:

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); 

} 
]; 

我希望這幫助的人。

+0

這幫了我很多!在塊完成後消除延遲。 –

+0

如何獲取「失敗」區塊中的內容?我在響應中包含內容的失敗塊中獲得了HTTP狀態400。 – TheFox

+0

operation.responseString會這樣做。在我的情況下,唯一的問題是,有時responseString爲零(即使當我知道數據被髮回時) – elsurudo

0

我對HTTP POST的解決方案是這樣的

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) { 
      }]; 

,在這種情況下,入列的操作管理器中的單個操作。

相關問題