leichunfeng / MVVMReactiveCocoa

GitBucket iOS App

Home Page:https://itunes.apple.com/cn/app/id961330940?mt=8

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

我想请教您一个跟项目无关的rac问题,如果您有时间希望解答一下

Insofan opened this issue · comments

我有一个需求 需要三个新号按顺序完成后发送一个新的新号给下一个订阅者,但是无论我怎么调整 subscribe 的位置,或者三个信号的发送位置,都会先发出sendNext,或者根本不发出sendNext,导致 订阅者总是执行顺序错误,会先读取数据再replace数据库,如果您有时间希望解答一下代码该怎么调整,谢谢.下面是我的代码,如果有什么别的写法也可以告诉我.

- (RACSignal *)replacePubRecentContact {
    @weakify(self);
    return [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
        NSMutableArray <RIMRecentContactModel *> *contactModelMutableArray = [NSMutableArray new];
        //1 Signal first
        RACSignal *selectMessageSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [[[RIMPublicPostDatabaseManager sharedInstance] selectLastMessage] subscribeNext:^(NSArray <RIMRecentContactModel *> *pubContactModelArray) {
                //这里穿回来的lastmMessage是一个pmsgId
                for (NSUInteger i = 0; i < pubContactModelArray.count; ++i) {
                    if (pubContactModelArray[i].uid > 0) {
                        [contactModelMutableArray addObject:pubContactModelArray[i]];
                    }
                }
                [subscriber sendNext:@"pub replace select last message bingo"];
                [subscriber sendCompleted];
            }];
            return nil;
        }];
        
        
        //2 Signal second
        RACSignal *selectInfoSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            @strongify(self);
            for (NSUInteger j = 0; j < contactModelMutableArray.count; ++j) {
                @strongify(self);
                
                [[self selectPubInfoWithPid:contactModelMutableArray[j].uid] subscribeNext:^(RIMPubInfoModel *pubInfoModel) {
                    contactModelMutableArray[j].username = pubInfoModel.name;
                    contactModelMutableArray[j].avatar = pubInfoModel.logo;
                }];
            }
            [subscriber sendNext:@"pub replace select info bingo"];
            [subscriber sendCompleted];
            return nil;
        }];
        
        //3 Signal third
        RACSignal *replaceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [self.contactDatabaseQueue inDatabase:^(FMDatabase *db) {
                for (NSUInteger k = 0; k < contactModelMutableArray.count; ++k) {
                    RIMRecentContactModel *recentContactModel = contactModelMutableArray[k];
                    //公众号type 3
                    recentContactModel.messageType = 3;

                    NSString *replaceSql = [NSString stringWithFormat:@"REPLACE INTO  recentContact (uid, username, avatar, lastMessage, unRead, lastMessageTs, messageType, lastMessageMid, lastMessageSid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"];
                    //这里因为私聊公众号id重复所以加3
                    BOOL result = [db executeUpdate:replaceSql, @(recentContactModel.uid), recentContactModel.username, recentContactModel.avatar, recentContactModel.lastMessage, @(recentContactModel.unRead), @(recentContactModel.lastMessageTs), @(recentContactModel.messageType), @(recentContactModel.lastMessageMid), @(recentContactModel.lastMessageSid)];
                    if (!result) {
                        NSLog(@"插入最近联系人表失败");
                    } else {
                        NSLog(@"插入最近联系人表成功");
                    }
                }
                [subscriber sendNext:@"replace公众号最近联系人表成功"];
                
            }];
            return nil;
        }];
        [[[selectMessageSignal concat:selectInfoSignal] then:^RACSignal *{
            return replaceSignal;
        }] subscribeCompleted:^{
        }];
        [subscriber sendNext:@"replace pub all bingo"];
        [subscriber sendCompleted];
        return nil;
    }];
}