类似微信的语音连播的递归算法

本算法实现了微信的语音连播功能:即自动读取本条之后的未读语音消息;连播一般都是一条播放完成,在接着播放下一条。

- (void)clickCellVoice:(VMessageEntity *)model

{

__weak
VChatsViewController *weakSelf =
self;

if ([self.keyBoardView
isFirstResponder])

{

[self
tapAnywhereToDismissKeyboard:nil];

}

if (model)

{

model.readStatus =
VMessageHaveRead;

VChatVoiceBaseCell *voiceCell =
nil;

for (UITableViewCell *cell
in [_tableView
visibleCells]) {

if ([cell
isKindOfClass:[VChatVoiceBaseCell
class]]) {

VChatVoiceBaseCell *tempVoiceCell  =(VChatVoiceBaseCell *)cell;

if ( tempVoiceCell.message.messageId == model.messageId)
{

voiceCell = (VChatVoiceBaseCell *)cell;

break;

}

}

}

if (voiceCell)

{

if (![[VAudioPalyerManager
sharedManager] isPlaying]) {

[voiceCell.playIcon
startAnimating];

model.voiceMessage.isPlaying =
YES;

[[VAudioPalyerManager
sharedManager] playWithfile:model.voiceMessage.voicemd5
finishPlaying:^(NSString *fileName,BOOL isFinished) {

[voiceCell.playIcon
stopAnimating];

model.voiceMessage.isPlaying =
NO;

if (isFinished) {

if (model.messageStatus ==
VMessageStatusNone)

{

[weakSelf playNextUnReadVoiceWithMessageEntity:model];

}

}

}];

}else
if([[VAudioPalyerManager
sharedManager]isPlaying] &&![model.voiceMessage.voicemd5
isEqualToString:[[VAudioPalyerManager
sharedManager] currentFileName]])
//如果正在播放,且与当前的文件名不同,停止播放当前的播放效果,播放另外一条。

{

[[VAudioPalyerManager
sharedManager] stop];

[voiceCell.playIcon
startAnimating];

model.voiceMessage.isPlaying =
YES;

[[VAudioPalyerManager
sharedManager] playWithfile:model.voiceMessage.voicemd5
finishPlaying:^(NSString *fileName,
BOOL isFinish) {

[voiceCell.playIcon
stopAnimating];

model.voiceMessage.isPlaying =
NO;

if (isFinish) {

if (model.messageStatus ==
VMessageStatusNone)

{

[weakSelf playNextUnReadVoiceWithMessageEntity:model];

}

}

}];

}else
if([[VAudioPalyerManager
sharedManager]isPlaying] && [model.voiceMessage.voicemd5
isEqualToString:[[VAudioPalyerManager
sharedManager] currentFileName]])
// 处理当前正在播放的语音,停止当前的语音播放

{

[[VAudioPalyerManager
sharedManager] stop];

model.voiceMessage.isPlaying =
NO;

if([voiceCell.playIcon
isAnimating])

{

[voiceCell.playIcon
stopAnimating];

}

}

}

}

}

//递归查找下一条未读语音消息

- (void)playNextUnReadVoiceWithMessageEntity:(VMessageEntity *)model

{

//找到message在chatArray里面的位置

__weak
VChatsViewController *weakSelf =
self;

if (model) {

NSIndexPath *index = [NSIndexPath
indexPathForRow:[self.messageArray
indexOfObject:model] inSection:0];

if (index)

{

for (NSInteger i = index.row+1;
i < self.messageArray.count; i++) {

id tempObj =
self.messageArray[i];

if ([tempObj
isKindOfClass:[VMessageEntity
class]])

{

VMessageEntity *messageEntity = (VMessageEntity *)tempObj;

if (messageEntity.messageType ==
VMessageTypeVoice && messageEntity.messageStatus ==
VMessageStatusNone)

{//判断是语音消息

if (messageEntity.readStatus ==
VMessageNoRead)

{

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1
* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

//取到下一条的cell

VChatVoiceReceiveCell *voiceBaseCell =
nil;

for (UITableView *cell
in [_tableView
visibleCells]) {

if ([cell
isKindOfClass:[VChatVoiceReceiveCell
class]]) {

VChatVoiceReceiveCell *tempBaseCell  = (VChatVoiceReceiveCell *)cell;

if (tempBaseCell.message.messageId == messageEntity.messageId)
{

voiceBaseCell = (VChatVoiceReceiveCell *)cell;//找到cell

}

}

}

//找到cell,更新UI

[voiceBaseCell.playIcon
startAnimating];

//更新数据库消息的未读状态,去掉未读标记

[voiceBaseCell
receiveVoiceCellBeClick];

//更新数据库

[[VMessageManager
sharedManager] updateReadStatusWithClientMessageId:messageEntity.clientMessageId
readStatus:VMessageHaveRead
userId:messageEntity.sendUserId];

messageEntity.readStatus =
VMessageHaveRead;

[weakSelf.messageArray
replaceObjectAtIndex:i  withObject:messageEntity];

//进行播放

messageEntity.voiceMessage.isPlaying  =
YES;

[[VAudioPalyerManager
sharedManager] playWithfile:messageEntity.voiceMessage.voicemd5
finishPlaying:^(NSString *fileName,
BOOL isFinish) {

[voiceBaseCell.playIcon
stopAnimating];

messageEntity.voiceMessage.isPlaying  =
NO;

if (isFinish) {

if (model.messageStatus ==
VMessageStatusNone)

{

//isFinish == yes 则完整播放,再次调用这个方法

[weakSelf
playNextUnReadVoiceWithMessageEntity:model];

}

}

}];

});

break;

}

}

}else{

NSLog(@"不是消息类型");

}

}

}

}

}

时间: 2024-07-30 09:12:44

类似微信的语音连播的递归算法的相关文章

类似微信发送语音,按下录音,松开结束录音;并且可播放

需要导入 #import <AVFoundation/AVFoundation.h> 利用此框架中的 AVAudioRecorder和AVAudioPlayer来录音和播放以下是AVAudioRecorder录音的使用方法: - (IBAction)downAction:(id)sender { 按下录音 if ([self canRecord]) { NSError *error = nil; 必须真机上测试,模拟器上可能会崩溃 recorder = [[AVAudioRecorder al

实现类似微信语音播放动画的效果

要求就是点击播放按钮,小喇叭开始动,当语音结束后,停止动画.如图: 这需要用到UIImageView的帧动画,该动画可以让一系列图片在特定的时间内按顺序显示出来.需要的素材如下: audio_icon_1 *****分割线***** audio_icon_2 *******分割线*******audio_icon_3 代码如下: // 添加播放时候的动画图片 [_audioBtn addSubview:self.animationview]; [_audioBtn setImage:[UIIma

TP3.23开发的分答微信版语音问答系统源码

演示地址:http://yd.168282.com (请在微信中打开演示) 公众号演示:(请直接扫码演示) 9月最新功能如下:1.易答:付费你(我)问,我(你)答,有人付费听,你我分钱.2.录音时自动转MP3格式,支持所有移动端设备3.每晚程序自动结算4.收入.支出 账目明细5.赞赏:如果你觉得答主答得漂亮,可以直接为他点赞6.问题搜索:搜人不够,还想搜问题,我们已经实现了这功能7.拒绝回答:不想回答的问题直接拒绝8.多级分类9.增强答主审核机制10.图文回答,图文提问,可后台开启11.追问功能

小功能——类似微信里,评论内容里面,点击每个人的用户名进入个人主页

项目里的朋友圈页面,每幅图片的评论内容里面,有不同的用户进行评论,起初想法是点击用户名直接进行回复,后来看微信都是点击评论内容进行回复评论的发起人,这个好做,把这个textview绑定一个监听器就ok了 后来再一想,如果要实现类似微信点击用户名就进入用户的主页,怎么让用户名可以点击呢? 现在父布局下面在new一个水平布局的linearlayout,然后根据把每个用户.包括评论内容都设置进textview里面,然后通过linearlayout的addview()方法,把这些textview添加进去

android 实现类似微信缓存和即时更新好友头像

引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新,这个功能是如何实现的呢,我们来分析一下 分析 关于头像缓存的实现 头像是网络图片,而且数据量较大,如果用我们常用的SharedPreferences将头像以Bitmap的形式存储,势必会造成OOM,这个方法是行不通的,我们存储的只能是图片的地址,但是如果只存储地址的话,要转化成图片,还是要通过网络

iOS开发&gt;学无止境 - AKTabBarController:类似微信的第三方库

自从有了评论之后,就可以很方便的和大家交流.以前都是我一个人默默的发文章,看不出大家对文章的看法.评论开通之后,就可以很快速的获取大家对文章的看法. 有人会指出文章里有错误的地方,真的很感激他们,非常的认真:有人会对文章说出自己的见解,加深自己的印象,同时,也能帮助到其他的朋友:有人也会在评论里,提出一些问题,但是鉴于评论的字数限制,只能简单的回答一下. 在昨天的文章评论里面,有一个朋友提出了一个问题,关于微信导航栏的. 问题分析和解答 问: 自定义导航栏怎么写?就像微信那样,tabBar的四个

Android学习--------实现增删改查数据库操作以及实现类似微信好友对话管理操作

最近的一个实验用到东西挺多,特地总结一下. 要求功能: 1.第一个页面添加歌曲名和歌手,跳到第二个页面列表显示所有记录,使用sqlite数据库 2.对于第二个页面显示的信息可以进行删除和修改操作,并自动刷新 最后我做的效果: 长按列表项弹出单个管理的菜单,像微信好友对话管理一样. 删除时可以直接删除这一条并在列表中直接显示,更新时弹出对话框更新内容提交后在列表中重新显示. 做此例遇到的困难: 1.菜单获取上下文 2.获取对话框中的内容 3.对话框按钮添加监听事件-----注意包不要导错:impo

利用html5实现类似微信的手机摇一摇功能

利用html5实现类似微信的手机摇一摇功能,并播放音乐. 1.  deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向等. 2.  deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据. 不多说直接上代码, Javascript: [javascript] view plaincopy var SHAKE_THRESHOLD = 3000; var last_update = 0;

类似微信通讯录界面的排序方法及中文转拼音的方法

最近做一个类似微信的通讯录列表,因为本人也算个新手,然后呢,就遇到点问题.难点在对昵称的排序上,顺带着也就找了找中文转拼音的方法. 废话不多说,直接贴代码吧 1.首先要对昵称字符串进行中文转拼音,这个比较简单,写到NSString分类里面就行. - (NSString *)pinyin; { NSMutableString *str = [self mutableCopy]; CFStringTransform(( CFMutableStringRef)str, NULL, kCFStringT