NSoperation是ios封装好的的实现多线程的很简单的一种方法。
定义ImageDownloader,这个类继承NSOperation,因为需要并发,需要实现下面4个方法:
//是否允许并发,
-(BOOL)isConcurrent ;
-(BOOL)isExecuting;
//是否已经完成,这个必须要重载,不然放在NSOperationQueue里的NSOpertaion不能正常释放。
-(BOOL)isFinished
//具体下载的方法在这里执行。
-(void)start
而对应于非并发的情况下,只需要重载main方法就好了。
头文件
ImageDownloader.h
定义如下:
#import
@protocol imageDownloaderDelegate;
@interface ImageDownloader : NSOperation
{
NSURLRequest* _request;
NSURLConnection*_connection;
NSMutableData*_data;//请求的数据
BOOL_isFinished;
id delegate;
NSObject*delPara;//可携带额外的参数
}
- (id)initWithURLString:(NSString *)url;
@property (readonly) NSData *data;
@property(nonatomic, assign) id delegate;
@property(nonatomic, retain) NSObject *delPara;
@end
@protocol imageDownloaderDelegate
@optional
//图片下载完成的代理方法
- (void)imageDidFinished:(UIImage *)image para:(NSObject *)obj;
@end
实现文件
ImageDownloader.m
定义如下:
#import "ImageDownloader.h"
@implementation ImageDownloader
@synthesize data=_data;
@synthesize delegate;
@synthesize delPara;
- (void)dealloc
{
[_requestrelease];
_request=nil;
[_data release];
_data=nil;
[_connection release];
_connection=nil;
[delPara release];
[super dealloc];
}
- (id)initWithURLString:(NSString *)url
{
self = [self init];
if (self) {
_request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:url]];
_data = [[NSMutableData data] retain];
}
return self;
}
//开始处理-本类的主方法
- (void)start {
if (![self isCancelled]){
[NSThread sleepForTimeInterval:3];
//以异步方式处理事件,并设置代理
_connection=[[NSURLConnectionconnectionWithRequest:_request delegate:self]retain];
while(_connection != nil) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopModebeforeDate:[NSDate distantFuture]];
}
}
}
#pragma mark NSURLConnection delegate Method
//接收到数据(增量)时
- (void)connection:(NSURLConnection*)connection
didReceiveData:(NSData*)data
{
// 添加数据
[_data appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection*)connection{
[_connection release],
_connection=nil;
NSLog(@"%s", __func__);
UIImage *img = [[[UIImagealloc] initWithData:self.data] autorelease];
if (self.delegate != nil)
{
[delegate imageDidFinished:imgpara:self.delPara];
}
}
-(void)connection: (NSURLConnection *) connection didFailWithError:(NSError *) error
{
[_connection release],
_connection=nil;
}
-(BOOL)isConcurrent
{
//返回yes表示支持异步调用,否则为支持同步调用
return YES;
}
- (BOOL)isExecuting
{
return _connection ==nil;
}
- (BOOL)isFinished
{
return _connection == nil;
}
应用举例:
NSString *url =@”xxxxxxx“;
NSString*param=@”额外参数“;
ImageDownloader *downloader = [[[ImageDownloader alloc] initWithURLString:url] autorelease];
downloader.delegate = self;
downloader.delPara = param;
NSOperationQueue*queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:downloader];
#pragma delegate
- (void)imageDidFinished:(UIImage *)image para:(NSObject *)obj
{
//image,下载下来的图片;
NSString*param = (NSString *)obj;//附带的参数;
}
为吸引和聚拢广大开发者加入HTML5阵营,搭建技术交流分享的平台,促进HTML5和云生态系统的繁荣发展,MM开发环境联合中国移动研究院举办2013年首届MM应用引擎开发者大赛。只要你有好的想法或者已成熟的应用,就可报名参加我们的赛事,参与活动就有机会赢得丰厚奖品哦!
大赛火热征集基于MM开发环境和MM应用引擎开发部署的HTML5的Web和Mobile应用。10月8日-11月15日报名提交作品,赶快来报名参赛吧!iPad mini、红米手机……等你来拿!
本文所介绍的高频头以DVB-c tuner(数字有线电视)为例
一、硬件解析(对硬件原理不熟悉,只能说个大概)
高频头(tuner),也称之为调频器,主要有三个功能:
1)选择频道即选台,在硬件上应该就是个过滤器吧,选择出指定频率的信号
2)放大功能,就是个信号放大器了
3)变频功能,将选定频率的信号转换为中频信号,以供后续demod使用 这里面有个AGC器件(原理上就是稳定信号的所用,在人体上相似的功能也存在,如看到强光、听到的声音太大时)
附NXP nxp Semiconductors公司的TDA18250的block图:
说到tuner,就不得不介绍demod,两个器件协同工作,构成信号处理的frontend
1)demod随处可见,根据不同的调制方式FM、AM、QAM等,也存在对应类型的demod
2)日常所见的,像收音机、电视机、机顶盒、上网的解调器等都含有相关的demod
附LGS-8G52的demod图(没找到合适的图,用DVB-T的demod示意一下,原理是相同的):
从数据流的角度看这两个器件的输入输出:cable RF(有线电视线)--RF--> tuner --IF(中频)--> demod --TS(mpeg ts流)
二、软件解析(从如何program的角度解析)
1)tuner和demod都是I2C器件,器件厂家会提供相关驱动,但都要求实现I2C读写接口来完成对这两个器件的控制和状态读取(主要的目的就是可以读写这两个器件的寄存器)
2)从软件上层应用控制的角度来观察,这个两个器件的输入和输出
输入 输出
tuner freq(频率) lockstate(锁频状态)
demod symbol rate(符号率) 误码率
modulation mode(调制模式) 信号强度
信噪比等
3)在软件实现上,两个器件一般会一起实现相应的frontend接口供上层应用,介绍下主要的两个接口 初始化和锁频(本质上就是上文提到的i2c读写寄存器):
init()
{
registe_i2c();//注册相关i2c读写接口
//初始化,设置ts流输出模式(串行或者并行)等
if()//tuner的i2c主控在demod上
{
demod_init();//初始化demod,并将tuner I2C地址写入demod,进行tuner的相关初始化
}
else
{
tuner_init();
demod_init();
}
}
lock_frequency(freq,symbolrate,mode)
{
//设置freq
if()//tuner的i2c主控在demod上
{
demod_setfreq(freq);//通过demod,设置tuner的freq
}
else
{
tuner_setfreq();
}
//设置demod的相关参数
demod_setpara(symbolrate,mode....);
demod_restart();//涉及到部分模式选择、重启等
}