在一個有返回值的方法中,用block回傳的解決方法


在項目中,集成了環信sdk,當使用

- (id<IConversationModel>)conversationListViewController:(EaseConversationListViewController *)conversationListViewController modelForConversation:(EMConversation *)conversation;

 

這個方法時候,發現,返回的是一個model,而我在拼接model時候,需要進行查詢操作,查詢操作在block中,如下:

        [[DataBaseHandle shareDataBaseHandle] selectOneTabelName:@"contactList"

                                                             cls: MUCContactListModel.class

                                                             key:@"huanxinId" value:conversation.conversationId

                                                          result:

         ^(NSArray *resultArray) {

            listModel = resultArray.firstObject;

        } error:^(NSError *error) {

            mError = error;

        }];

 

問題再此出現了:需要的model在block中,不知道什么時候執行完成,而這個方法又要返回該model,該如何處理呢?

最后,問題如下解決了:

 

- (id<IConversationModel>)conversationListViewController:(EaseConversationListViewController *)conversationListViewController modelForConversation:(EMConversation *)conversation  {

    EaseConversationModel *model = [[EaseConversationModel alloc] initWithConversation:conversation];  

    if (model.conversation.type == EMConversationTypeChat) {

#warning !!!replaceFMDBByFMDBQueue---

        __block MUCContactListModel *listModel = nil;

        __block NSError *mError = nil;

        

        [[DataBaseHandle shareDataBaseHandle] selectOneTabelName:@"contactList"

                                                             cls: MUCContactListModel.class

                                                             key:@"huanxinId" value:conversation.conversationId

                                                          result:

         ^(NSArray *resultArray) {

            listModel = resultArray.firstObject;

        } error:^(NSError *error) {

            mError = error;

        }];

        do {

            usleep(500);

        } while (!listModel || !mError);

        

        if (mError) {

            DLog(@"%@",mError.description);

            return model;

        }

        

        model.title = listModel.name;

        model.avatarURLPath = listModel.photo;

        model.avatarImage = nil;

  

    }

    return model;

}

 

即:在block代碼塊后面,進行一個循環判斷,只有當出現error,或者有model的時候,再向下執行,否則就持續休眠500毫秒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM