2014-12-05 17 views
1

我想創建以下類方法:傳遞__block參數類方法(GET請求)

+(void) getValue4Key:(NSString*)p_key andSet:(id)p_variable 
{  
    NSString *baseURLString = <<myURL>>; 
    @try{ 
     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
     [manager GET:baseURLString 
      parameters:nil 
      success:^(AFHTTPRequestOperation *operation, id responseObject) { 
       NSDictionary* element = responseObject[0]; 
       element = [element objectForKey:@"fields"]; 

       p_variable = [element objectForKey:@"value"]; 
      } 
      failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       NSLog(@"getSystemVariableKey error: %@",error); 
      }]; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"exception %@", exception); 
    } 
} 

兩個問題:

  1. 我收到以下錯誤:變量不分配(缺少 __block類型說明符)如何設置塊的方法參數?
  2. 如何調用這個函數,我應該通過變量&self.setMe
+0

不要在ARC下使用異常,除非你知道你做了什麼,哪些不做。 – Andy 2014-12-05 22:08:55

回答

3

我不認爲通過引用傳遞伊娃的方法在稍後時間異步設置是一種好方法。如果在請求完成之前將對象(在問題#2中稱爲self,self.setMe)銷燬?你將會有隨機崩潰。

相反,你應該完成塊處理這個調用者可以用它來設置伊娃:

+ (void)getValue4Key:(NSString*)p_key 
     withCompletion:(void (^)(id value))completion 
{  
    NSString *baseURLString = <<myURL>>; 
    @try{ 
     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
     [manager GET:baseURLString 
      parameters:nil 
      success:^(AFHTTPRequestOperation *operation, id responseObject) { 
       NSDictionary* element = responseObject[0]; 
       element = [element objectForKey:@"fields"]; 

       id value = [element objectForKey:@"value"]; 
       if (completion) { 
        completion(value); 
       } 
      } 
      failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       NSLog(@"getSystemVariableKey error: %@",error); 
       if (completion) { 
        completion(nil); 
       } 
      }]; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"exception %@", exception); 
    } 
} 

那麼你會調用這個函數是這樣的:

YourObject *__weak weakSelf = self; 
[YourObject getValue4Key:@"your_key" completion:^(id value){ 
    weakSelf.setMe = value; 
}]; 

現在,如果self被破壞,weakSelf將成爲零,所以回調將基本上是無操作。

這有一個額外的優勢,不需要通過引用傳遞伊娃指針,你會注意到,在iOS框架中並不經常發生(NSError是我能想到的唯一的例外) 。

0

p_variable是一個參數,它是函數的局部變量。在某些操作結束時,塊將異步運行。塊運行時,getValue4Key:andSet:已經返回很長時間。因此,即使可以設置,也無人使用變量p_variable