123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- //
- // 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<RQViewModelServices>)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<RACSubscriber> _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
|