// // RQTestQuestionsViewModel.m // SDJK // // Created by 张嵘 on 2021/8/12. // #import "RQTestQuestionsViewModel.h" @interface RQTestQuestionsViewModel () @property (nonatomic, readwrite, assign) RQExerciseOptionItemType exerciseOptionItemType; @property (nonatomic, readwrite, assign) RQAnswerResultsType answerResultsType; @property (nonatomic, readwrite, copy) NSArray *optionLeftNameArr; @property (nonatomic, readwrite, assign) RQExerciseType exerciseType; /// homePageCarType @property (nonatomic, readwrite, assign) RQHomePageCarType homePageCarType; /// homePageSubjectType @property (nonatomic, readwrite, assign) RQHomePageSubjectType homePageSubjectType; @property (nonatomic, readwrite, assign) RQExerciseDoType exerciseDoType; @property (nonatomic, readwrite, strong) RQCommonGroupViewModel *explainGroup; @property (nonatomic, readwrite, strong) RQExercisExplainItemViewModel *exercisExplainItemViewModel; @end @implementation RQTestQuestionsViewModel #pragma mark - Public Method - (instancetype)initWithServices:(id)services params:(NSDictionary *)params { if (self = [super initWithServices:services params:params]) { self.exerciseOptionItemType = RQExerciseOptionItemType_Default; self.answerResultsType = RQAnswerResultsType_Unanswered; self.exerciseType = [params[RQExerciseTypeKey] integerValue]; self.exerciseModel = (RQExerciseModel *)params[RQViewModelUtilKey]; self.homePageCarType = [params[RQHomePageCarTypeKey] integerValue]; self.homePageSubjectType = [params[RQHomePageSubjectTypeKey] integerValue]; self.exerciseDoType = RQExerciseDoType_Default; } return self; } - (void)initialize { [super initialize]; self.title = @""; /// 隐藏导航栏的细线 self.prefersNavigationBarBottomLineHidden = YES; ///配置数据 // [self rq_configureData]; } - (void)setExerciseModel:(RQExerciseModel *)exerciseModel { _exerciseModel = exerciseModel; [self rq_configureData]; } #pragma mark - PrivateMethod - (void)rq_configureData { @weakify(self) /// 第零组:题目 RQCommonGroupViewModel *group0 = [RQCommonGroupViewModel groupViewModel]; group0.headerHeight = CGFLOAT_MIN; group0.footerHeight = CGFLOAT_MIN; RQExerciseQuestionItemViewModel *exerciseQuestionItemViewModel = [[RQExerciseQuestionItemViewModel alloc] initWithRQExerciseModel:self.exerciseModel]; group0.itemViewModels = @[exerciseQuestionItemViewModel]; /// 第二组:答案 RQCommonGroupViewModel *group2 = [RQCommonGroupViewModel groupViewModel]; group2.headerHeight = CGFLOAT_MIN; group2.footerHeight = CGFLOAT_MIN; RQExerciseAnswerItemViewModel *exerciseAnswerItemViewModel = [[RQExerciseAnswerItemViewModel alloc] initWithRQExerciseModel:self.exerciseModel]; if (RQStringIsNotEmpty(_exerciseModel.userAnswer) && ![_exerciseModel.userAnswer containsString:@"预选Option"] && _exerciseType != RQExerciseType_Test && _exerciseType != RQExerciseType_Exam) { group2.itemViewModels = @[exerciseAnswerItemViewModel]; } else { group2.itemViewModels = @[]; } /// 第三组:多选题确定按钮 RQCommonGroupViewModel *group3 = [RQCommonGroupViewModel groupViewModel]; group3.headerHeight = CGFLOAT_MIN; group3.footerHeight = CGFLOAT_MIN; RQExerciseOptionSureBtnItemViewModel *exerciseOptionSureBtnItemViewModel = [[RQExerciseOptionSureBtnItemViewModel alloc] init]; exerciseOptionSureBtnItemViewModel.rowHeight = RQ_FIT_HORIZONTAL(56.f); exerciseOptionSureBtnItemViewModel.operation = ^{ @strongify(self) if ([_exerciseModel.userAnswer containsString:@"预选Option-"]) { NSString *userAnswerStr = _exerciseModel.userAnswer; userAnswerStr = [userAnswerStr stringByReplacingOccurrencesOfString:@"预选Option-" withString:@""]; _exerciseModel.userAnswer = userAnswerStr; [self rq_configureData]; } else { } }; if ([_exerciseModel.answer containsString:@"-"] && self.answerResultsType == RQAnswerResultsType_Unanswered) { group3.itemViewModels = @[exerciseOptionSureBtnItemViewModel]; } else { group3.itemViewModels = @[]; } /// 第四组:练习模式的《收藏、读题+答案、读题、技巧讲解》工具栏 RQCommonGroupViewModel *group4 = [RQCommonGroupViewModel groupViewModel]; group4.headerHeight = CGFLOAT_MIN; group4.footerHeight = CGFLOAT_MIN; RQExerciseToolBarItemViewModel *exerciseToolBarItemViewModel = [[RQExerciseToolBarItemViewModel alloc] initWithRQExerciseModel:self.exerciseModel homePageCarType:self.homePageCarType homePageSubject:self.homePageSubjectType readingQuestionsAndAnswerCommand:[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self) _exerciseModel.userAnswer = _exerciseModel.answer; _exerciseModel.answerResultsType = RQAnswerResultsType_Correct; _exerciseDoType = RQExerciseDoType_ReadAndAnswer; // self.explainGroup.itemViewModels = RQObjectIsNil(self.exercisExplainItemViewModel.explainModel)? @[] : @[self.exercisExplainItemViewModel]; [self rq_configureData]; if (RQ_Exercise_Module.isAutoRead) RQ_Exercise_Module.isAutoRead = NO; // return [self readAndAnswerWithExerciseModel:_exerciseModel]; return [RACSignal empty]; }] skillExplanationCommand:[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self) _exerciseModel.isShowSkillExplanation = YES; _exerciseDoType = RQExerciseDoType_SkillExplanation; if (RQ_Exercise_Module.isAutoRead) RQ_Exercise_Module.isAutoRead = NO; [self rq_configureData]; return [RACSignal empty]; }]]; exerciseToolBarItemViewModel.rowHeight = RQ_FIT_HORIZONTAL(85.f); group4.itemViewModels = (self.exerciseType == RQExerciseType_Test || self.exerciseType == RQExerciseType_Exam)? @[] : @[exerciseToolBarItemViewModel]; /// 第五组:底部工具栏 RQCommonGroupViewModel *group5 = [RQCommonGroupViewModel groupViewModel]; group5.headerHeight = CGFLOAT_MIN; group5.footerHeight = CGFLOAT_MIN; RQExerciseExamToolBarItemViewModel *exerciseExamToolBarItemViewModel = [[RQExerciseExamToolBarItemViewModel alloc] initWithRQExerciseModel:self.exerciseModel homePageCarType:self.homePageCarType homePageSubject:self.homePageSubjectType readingQuestionsAndAnswerCommand:[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self) _exerciseModel.userAnswer = _exerciseModel.answer; _exerciseModel.answerResultsType = RQAnswerResultsType_Correct; _exerciseDoType = RQExerciseDoType_ReadAndAnswer; [self rq_configureData]; if (RQ_Exercise_Module.isAutoRead) RQ_Exercise_Module.isAutoRead = NO; // return [self readAndAnswerWithExerciseModel:_exerciseModel]; return [RACSignal empty]; }] skillExplanationCommand:[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self) _exerciseModel.isShowSkillExplanation = YES; _exerciseDoType = RQExerciseDoType_SkillExplanation; if (RQ_Exercise_Module.isAutoRead) RQ_Exercise_Module.isAutoRead = NO; [self rq_configureData]; return [RACSignal empty]; }] lastQuestionCommand:[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self) [self.lastQuestionCommand execute:nil]; return [RACSignal empty]; }] nextQuestionCommand:[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self) [self.nextQuestionCommand execute:nil]; return [RACSignal empty]; }] showCatalogueCommand:[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self) [self.showCatalogueCommand execute:nil]; return [RACSignal empty]; }]]; exerciseExamToolBarItemViewModel.rowHeight = RQ_FIT_HORIZONTAL(80.f); group5.itemViewModels = (self.exerciseType != RQExerciseType_Test && self.exerciseType != RQExerciseType_Exam)? @[] : @[exerciseExamToolBarItemViewModel]; /// 第一组:选项 RQCommonGroupViewModel *group1 = [RQCommonGroupViewModel groupViewModel]; group1.headerHeight = CGFLOAT_MIN; group1.footerHeight = CGFLOAT_MIN; NSMutableArray *optionItemsArr = @[].mutableCopy; [[[self.exerciseModel.opts componentsSeparatedByString:@"-"].rac_sequence.signal deliverOnMainThread] subscribeNext:^(NSString * optionString) { @strongify(self) if (RQStringIsEmpty(_exerciseModel.userAnswer)) { /// 未答题 _exerciseOptionItemType = RQExerciseOptionItemType_Default; } else { /// 已答题 if ([_exerciseModel.answer containsString:@"-"]) { /// 多选题 if ([_exerciseModel.userAnswer containsString:@"预选Option"]) { /// 预选 if ([_exerciseModel.userAnswer containsString:optionString]) { _exerciseOptionItemType = RQExerciseOptionItemType_Multiple_Primary; } else { _exerciseOptionItemType = RQExerciseOptionItemType_Default; } } else { /// 答题结果 NSArray * arr1 = [_exerciseModel.answer componentsSeparatedByString:@"-"]; NSArray * arr2 = [_exerciseModel.userAnswer componentsSeparatedByString:@"-"]; NSPredicate * filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",arr1]; NSArray * filter = [arr2 filteredArrayUsingPredicate:filterPredicate]; if (filter.count == 0) { /// 答对了 self.answerResultsType = RQAnswerResultsType_Correct; if ([_exerciseModel.answer containsString:optionString]) { /// 正确的选项 _exerciseOptionItemType = RQExerciseOptionItemType_Correct_CorrectOption; } else { /// 错误的选项 _exerciseOptionItemType = RQExerciseOptionItemType_Correct_ErrorOption; } } else { /// 答错了 self.answerResultsType = RQAnswerResultsType_Error; if ([_exerciseModel.answer containsString:optionString]) { /// 正确的选项 _exerciseOptionItemType = RQExerciseOptionItemType_Error_CorrectOption; } else { /// 错误的选项 _exerciseOptionItemType = RQExerciseOptionItemType_Correct_ErrorOption; } } // if ([_exerciseModel.answer isEqualToString:_exerciseModel.userAnswer]) { // /// 答对了 // self.answerResultsType = RQAnswerResultsType_Correct; // if ([_exerciseModel.answer containsString:optionString]) { // /// 正确的选项 // _exerciseOptionItemType = RQExerciseOptionItemType_Correct_CorrectOption; // } else { // /// 错误的选项 // _exerciseOptionItemType = RQExerciseOptionItemType_Correct_ErrorOption; // } // } else { // /// 答错了 // self.answerResultsType = RQAnswerResultsType_Error; // if ([_exerciseModel.answer containsString:optionString]) { // /// 正确的选项 // _exerciseOptionItemType = RQExerciseOptionItemType_Error_CorrectOption; // } else { // /// 错误的选项 // _exerciseOptionItemType = RQExerciseOptionItemType_Correct_ErrorOption; // } // } } } else { /// 单选题 if ([_exerciseModel.answer isEqualToString:_exerciseModel.userAnswer]) { /// 答对了 self.answerResultsType = RQAnswerResultsType_Correct; if ([optionString isEqualToString:_exerciseModel.answer]) { /// 正确的选项 _exerciseOptionItemType = RQExerciseOptionItemType_Correct_CorrectOption; } else { /// 错误的选项 _exerciseOptionItemType = RQExerciseOptionItemType_Correct_ErrorOption; } } else { /// 答错了 self.answerResultsType = RQAnswerResultsType_Error; if ([optionString isEqualToString:_exerciseModel.answer]) { /// 正确的选项 _exerciseOptionItemType = RQExerciseOptionItemType_Error_CorrectOption; } else { /// 错误的选项 _exerciseOptionItemType = RQExerciseOptionItemType_Correct_ErrorOption; } } } } RQExerciseOptionItemViewModel *exerciseOptionItemViewModel = [[RQExerciseOptionItemViewModel alloc] initWithRQExerciseModel:self.exerciseModel opts:optionString RQExerciseOptionItemType:_exerciseOptionItemType exerciseType:self.exerciseType]; exerciseOptionItemViewModel.rowHeight = RQ_FIT_HORIZONTAL(55.f); if ([_exerciseModel.answer containsString:@"-"]) { exerciseOptionItemViewModel.title = (([_exerciseModel.userAnswer containsString:optionString]) && self.answerResultsType != RQAnswerResultsType_Unanswered && self.exerciseType != RQExerciseType_Recitation)? @"" : self.optionLeftNameArr[[[self.exerciseModel.opts componentsSeparatedByString:@"-"] indexOfObject:optionString]]; } else { exerciseOptionItemViewModel.title = ([optionString isEqualToString:_exerciseModel.userAnswer] && self.exerciseType != RQExerciseType_Recitation)? @"" : self.optionLeftNameArr[[[self.exerciseModel.opts componentsSeparatedByString:@"-"] indexOfObject:optionString]]; } exerciseOptionItemViewModel.operation = ^{ @strongify(self) if ([_exerciseModel.answer containsString:@"-"]) { NSMutableArray *userArray = [NSMutableArray arrayWithArray:RQStringIsEmpty(_exerciseModel.userAnswer)? @[] : [_exerciseModel.userAnswer componentsSeparatedByString:@"-"]]; if (userArray.count == 0) { [userArray addObject:@"预选Option"]; } if ([userArray containsObject:optionString]) { [userArray removeObject:optionString]; } else { [userArray addObject:optionString]; } NSString *myAnswer = [userArray componentsJoinedByString:@"-"]; _exerciseModel.userAnswer = myAnswer; } else { _exerciseModel.userAnswer = optionString; } [self rq_configureData]; }; [optionItemsArr addObject:exerciseOptionItemViewModel]; } completed:^{ @strongify(self) group1.itemViewModels = optionItemsArr.copy; [self willChangeValueForKey:@"dataSource"]; group3.itemViewModels = (self.answerResultsType == RQAnswerResultsType_Unanswered && [_exerciseModel.answer containsString:@"-"])? @[ exerciseOptionSureBtnItemViewModel ] : @[]; if (_answerResultsType != RQAnswerResultsType_Unanswered) { self.explainGroup.itemViewModels = RQObjectIsNil(self.exercisExplainItemViewModel.explainModel)? @[] : @[self.exercisExplainItemViewModel]; } self.dataSource = (self.exerciseType != RQExerciseType_Test && self.exerciseType != RQExerciseType_Exam)? @[group0, group1, group2, group3, group4, self.explainGroup, group5] : @[group0, group1, group2, group3, group4, group5, self.explainGroup]; [self didChangeValueForKey:@"dataSource"]; _exerciseModel.answerResultsType = _answerResultsType; [[NSNotificationCenter defaultCenter] postNotificationName:RQAnswerResultsNotification object:nil userInfo:@{ RQAnswerResultsKey : _exerciseModel, RQHomePageCarTypeKey : @(self.homePageCarType), RQHomePageSubjectTypeKey: @(self.homePageSubjectType), RQExerciseDoTypeKey : @(self.exerciseDoType), }]; }]; } - (RACSignal *)readAndAnswerWithExerciseModel:(RQExerciseModel *)exerciseModel { return [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { [RQ_MUSIC_MANAGER rq_resetStreamerWithURLString:exerciseModel.issuemp3 DOUAudioStreamerStatusBlock:^(DOUAudioStreamerStatus status) { if (status == DOUAudioStreamerFinished) { [RQ_MUSIC_MANAGER rq_resetStreamerWithURLString:exerciseModel.answermp3 DOUAudioStreamerStatusBlock:^(DOUAudioStreamerStatus status) { if (status == DOUAudioStreamerFinished) { [subscriber sendNext:@"DOUAudioStreamerFinished"]; } else if (status == DOUAudioStreamerPlaying) { [subscriber sendNext:@"DOUAudioStreamerPlaying"]; } }]; } else if (status == DOUAudioStreamerPlaying) { [subscriber sendNext:@"DOUAudioStreamerPlaying"]; } }]; return [RACScopedDisposable disposableWithBlock:^{ /// 取消任务 }]; }]; } - (NSArray *)optionLeftNameArr { if (!_optionLeftNameArr) { _optionLeftNameArr = @[@"A", @"B", @"C", @"D"]; } return _optionLeftNameArr; } - (RQCommonGroupViewModel *)explainGroup { if (!_explainGroup) { _explainGroup = [RQCommonGroupViewModel groupViewModel]; } return _explainGroup; } - (RQExercisExplainItemViewModel *)exercisExplainItemViewModel { if (!_exercisExplainItemViewModel) { _exercisExplainItemViewModel = [[RQExercisExplainItemViewModel alloc] initWithRQExerciseModel:self.exerciseModel]; } return _exercisExplainItemViewModel; } @end