2014-07-25 119 views
0

當我使用sendAsynchronousRequest方法的時候這個方法內塊會在執行外部代碼後執行?sendAsynchronousRequest方法會在塊外代碼前執行塊代碼

__block NSDictionary *dict; 
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 
    { 
     NSInteger httpStatus = [((NSHTTPURLResponse *)response) statusCode]; 
     NSLog(@"httpStatus inside block:%d",httpStatus); 
     if ([data length]>0 && connectionError==nil) 
     { 
      dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:nil]; 
     } 
     else if (connectionError) 
     { 
      UIAlertView *alt=[[UIAlertView alloc] initWithTitle:@"Error" message:[connectionError localizedDescription] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
      [alt show]; 
     } 
    }]; 

return dict;//it will return null because it will run before execute inner block of sendAsynchronousRequest 
+0

添加完畢塊來回報您的詞典內容 – nanjunda

+0

是。這就是使該方法異步的原因。直到請求完成後纔會調用「completionHandler」。這似乎是一個不完整的問題,也許你可以澄清你在問什麼? – Jonah

回答

0

異步請求總是在網絡線程中運行。 你的[NSOperationQueue mainQueue]意味着block-callback將在mainQueue中進行安排。 如果您想等到請求完成,您可以使用同步請求,或使用信號量來阻止當前線程。

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error; 

但要注意的是這種方式請求將阻止當前線程。使用這種方式時要小心。

+0

我可以使用這種方法,但是當我在那個時候使用這種方法'UIActivityIndi​​catorView'將不起作用 – Ronak

+0

你想要什麼?阻止當前線程或在後臺線程中運行。 – Suen

+0

'[self performSelectorInBackground:@selector(sendSynchronousRequest:returningResponse:error :) withObject:nil];'我可以用這個,但會出現錯誤 – Ronak

0

請用正楷方法

首先定義一個塊

 typedef void (^OnComplate) (NSDictionary * dict); 
- (void)viewDidLoad{ 
    [self getDataWithBlokc:^(NSDictionary *dict) { 
     NSLog(@"%@",dict); 
    }]; 
} 

使用下面的方法

-(void)getDataWithBlokc:(OnComplate)block{ 
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 
    { 
     NSInteger httpStatus = [((NSHTTPURLResponse *)response) statusCode]; 
     NSLog(@"httpStatus inside block:%d",httpStatus); 
     if ([data length]>0 && connectionError==nil) 
     { 
      NSDictionary* dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:nil]; 

      block(dict); 
     } 
     else if (connectionError) 
     { 
      UIAlertView *alt=[[UIAlertView alloc] initWithTitle:@"Error" message:[connectionError localizedDescription] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
      [alt show]; 
     } 
    }]; 
} 
+0

哪裏調用這個方法? – Ronak

+0

您想要獲取數據的位置。 –

+0

我將返回字典對象與數據.. – Ronak