将__block参数传递给类方法(用于获取请求)

时间:2014-12-05 18:16:43

标签: ios objective-c objective-c-blocks get-request

我想创建以下类方法:

+(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
  3. 传递变量,如何调用此函数

2 个答案:

答案 0 :(得分:3)

我不认为通过引用传递ivar的方法在以后的某个时间异步设置是一种很好的方法。如果在请求完成之前销毁了对象(在问题#2中称为self中的self.setMe),该怎么办?你将会发生随机崩溃。

相反,您应该使用调用者可用于设置ivar的完成块来处理此问题:

+ (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将变为零,因此回调将基本上是无操作。

这有一个额外的好处,就是不需要通过引用传递ivar指针,你会注意到,在iOS框架中根本不会发生这种情况(NSError是我能想到的唯一例外。 - 手)。

答案 1 :(得分:0)

p_variable是一个参数,它是函数的局部变量。您的块在某些操作结束时异步运行。当块运行时,getValue4Key:andSet:已经返回很久。因此,即使您可以设置它,也没有人可以使用p_variable变量。