1

我想创建以下类方法:

+(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
4

2 回答 2

3

我认为通过引用传递 ivar 以在以后异步设置的方法不是一个好方法。如果对象(在问题 #2 中称为selfin 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将变为 nil,因此回调将基本上是无操作的。

这具有不需要通过引用传递 ivar 指针的额外优势,您会注意到,这在 iOS 框架中根本不经常发生(NSError这是我能想到的唯一例外)。

于 2014-12-05T18:41:23.250 回答
0

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

于 2014-12-06T00:18:36.903 回答