我想创建以下类方法:
+(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);
}
}
两个问题:
&self.setMe
?答案 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
变量。