【问题标题】:AFNetworking Asynchronous Data FetchingAFNetworking 异步数据获取
【发布时间】:2012-06-15 17:27:05
【问题描述】:

我正在使用 AFNetworking 库从服务器提取 JSON 提要以填充 UIPickerView,但我在理解异步处理方式时遇到了一些麻烦。 @property classChoices 是用于填充UIPickerViewNSArray,因此网络调用只执行一次。但是,由于在返回实例变量时块还没有完成,getter 返回 nil,它最终导致我的程序稍后崩溃。任何解决此问题的帮助将不胜感激。如果您需要任何其他信息,请告诉我。

PickerViewController.m classChoices Getter

- (NSArray *)classChoices {
    if (!_classChoices) {
        // self.brain here refers to code for the SignUpPickerBrain below
        [self.brain classChoicesForSignUpWithBlock:^(NSArray *classChoices) {
            _classChoices = classChoices;
        }];
    }
    return _classChoices;
}

SignUpPickerBrain.m

- (NSArray *)classChoicesForSignUpWithBlock:(void (^)(NSArray *classChoices))block {
    [[UloopAPIClient sharedClient] getPath:@"mobClass.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseJSON) {
        NSLog(responseJSON);
        if (block) {
            block(responseJSON);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);

        if (block) {
            block(nil);
        }
    }];
}

【问题讨论】:

    标签: objective-c ios asynchronous objective-c-blocks afnetworking


    【解决方案1】:

    您需要在 PickerViewController 中使用类似以下的方法,该方法在下载后返回数组。返回回调后,您可以继续使用您的代码:

    - (void)classChoices:(void (^) (NSArray * classChoices)) _callback {
        if (!self.classChoices) {
            // self.brain here refers to code for the SignUpPickerBrain below
            [self.brain classChoicesForSignUpWithBlock:^(NSArray *classChoices) {
                _callback(classChoices);
            }];
        }
    }
    
    // call the method
    
    - (void) viewDidLoad {
    
        [super viewDidLoad];
    
        [self classChoices:^(NSArray * updatedChoices) {
    
            self.classChoices = updatedChoices;
    
            [self.pickerView reloadAllComponents];
    
        }];
    
    }
    

    【讨论】:

    • 也许我之前并不清楚,但classChoices@property;上面的代码用于覆盖它的 getter。另外,这已经是一个回调SignUpPickerBrain。将回调放在回调中似乎有点过于复杂,对吧?你到底在说什么会在_callback 内完成?
    • 将回调放在回调中很好,也不是特别复杂。无需重写 getter,只需将 classChoices 作为标准 NSMutableArray,然后在需要更新数组时调用 -classChoices(带有回调 - 我的代码在上面发布)。数组的更新将发生在 _callback 内部。我将更新答案以包含此代码。
    • 我已经编辑了您的代码以使其与编译器一致,但代码仍然无法正常工作。程序仍然因错误而崩溃:Thread 1: EXC_BAD_ACCESS (code=2, address=0x16).
    • 添加到数组之前需要初始化classChoices。
    • 听起来是个完美的主意。我倾向于将 MBProgressHUD 用于包含活动指示器的 HUD,将 SVProgressHUD 用于警报。由你决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2018-12-23
    • 2019-04-08
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多