




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【精品】blocks学习心得 blocks学习Ios4已经直接支持blocks,很有必要学习一下。 在ios,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。 Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。 它和传统的函数指针很类似,但是有区别blocks是inline的,并且它对局部变量是只读的。 Blocks的定义int(Multiply)(int,int)=(int num1,int num2)return num1*num2;定义了一个Multiply的blocks对象,它带有两个int参数,返回int。 等式右边就是blocks的具体实现,注意blocks体里的;。 Blocks可以访问局部变量,但是不能修改。 int multiplier=7;int(myBlock)(int)=(int num)multiplier+;/编译报错return num*multiplier;如果要修改就要加关键字_block_block intmultiplier=7;int(myBlock)(int)=(int num)multiplier+;/这样就可以了return num*multiplier;作为函数的参数,blocks某种意义上替代了回调函数或者delegate。 当函数调用了,假设某个事件触发,这时blocks里的内容就会运行。 这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。 系统API中已经有很多支持blocks参数了Completion handlersNotification handlersError handlersEnumerationView animationand transitionsSorting例如UIView animateWithDuration:(NSTimeInterval)duration animations:(void()()animations集合体中也可以运用blocks。 枚举一个数组时我们通常for(id objin Array);现在,NSString*area=Europe;NSArray*timeZoneNames=NSTimeZone knownTimeZoneNames;NSMutableArray*areaArray=NSMutableArray arrayWithCapacity:1;NSIndexSet*areaIndexes=timeZoneNames indexesOfObjectsWithOptions:NSEnumerationConcurrent passingTest:(id obj,NSUInteger idx,BOOL*stop)NSString*tmpStr=(NSString*)obj;returntmpStr hasPrefix:area;NSArray*tmpArray=timeZoneNames objectsAtIndexes:areaIndexes;tmpArray enumerateObjectsWithOptions:NSEnumerationConcurrent|NSEnumerationReverse usingBlock:(id obj,NSUInteger idx,BOOL*stop)areaArray addObject:obj substringFromIndex:area length+1;NSLog(Cities in%time zone:%,area,areaArray);在blocks中obj就是数组中的每个成员,我们就可以在blocks内对每个对象进行处理。 再比如NSMutableArray*mArray=NSMutableArray arrayWithObjects:a,b,abc,nil;NSMutableArray*mArrayCount=NSMutableArray arrayWithCapacity:1;mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:(id obj,NSUInteger idx,BOOL*stop)mArrayCount addObject:NSNumber numberWithInt:obj length;NSLog(%,mArrayCount);你会发现,这样写代码更容易读懂。 最后,看一个排序的例子NSArray*stringsArray=NSArray arrayWithObjects:string1,String21,string12,String11,String02,nil;static NSStringCompareOptionsparisonOptions=NSCaseInsensitiveSearch|NSNumericSearch|NSWidthInsensitiveSearch|NSForcedOrderingSearch;NSLocale*currentLocale=NSLocale currentLocale;NSComparator finderSort=(id string1,id string2)NSRange string1Range=NSMakeRange(0,string1length);returnstring1pare:string2options:parisonOptions range:string1Range locale:currentLocale;NSLog(finderSort:%,stringsArray sortedArrayUsingComparator:finderSort);结果finderSort:(string1,String02,String11,string12,String21)作者:on myway发表于xx-01-2112:08原文链接评论:0查看评论发表评论最新新闻谷歌高层电话会议公司策略不会有实质性改变(xx-01-2112:08)淘花网联手索尼等打造中国数字音乐交易平台(xx-01-2112:05)苹果iPad2或将在2月9日正式发布(xx-01-2111:47)Opera Mini用户数突破8500万(xx-01-2111:37)三星收购荷兰Liquavista争电子书显示屏技术(xx-01-2111:35)推荐我们的创业步伐网站导航博客园首页我的园子新闻闪存小组博问知识库折叠发给朋友发给朋友转到小组转到小组(打标签)(打标签)收藏已藏推荐已荐0推荐收藏串口通信中接收数据时延迟处理与缓存处理的解决方案(C#)58分钟前利用串口进行通信,当发送方(A)将数据写入串口后,通过无线或有线方式将数据传送给接收方(B),B通过调用串口读方法m.read(参数)即可将数据读出。 原理十分简单,但最近在利用串口处理SM-42无线传输时,数据总是一段一段的传到B,并不能在m_DataReceived方法中单纯使用read方法将数据接收完全。 我知道用缓存机制,但由于经验少(正在实习),到网上找了找大牛们的方法,并结合自己的理解,发现有两种方法可以处理。 方法一m_DataReceived(Comm控件的数据接收方法,当有数据来临时会触发)会创建一个线程(悲哀,因为之前不知道它另辟线程,所以自己编写了一个线程处理函数),因此当串口在等待数据时,不影响主窗体或主线程的操作。 所以当数据到来时,可以通过Thread.Sleep (100)让接收函数休息100毫秒,这100毫秒做什么用呢?就是让所有的数据都到达B时再读取,这样就逃避了分批到达的问题。 很明显,这是在糊弄。 因为万一100毫秒都不够呢?所以,方法二更合适。 代码1private voidm_DataReceived(objectsender,EventArgs e)23Thread.Sleep (100);/等待100毫秒4int nReviceBytesNum=m.BytesToRead;/收到的字节数。 5byteReadBuf=new bytenReviceBytesNum;/定义接收字节数组6m.Read(ReadBuf,0,nReviceBytesNum);/接收数据7方法二使用缓存机制完成。 首先通过定义一个成员变量List buffer=new List (4096);用来存放所有的数据,在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对buffer中的数据进行检验,如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。 具体代码如下代码private Listbuffer=new List (4096);private voidsp_DataReceived(objectsender,EventArgs e)/sp是串口控件int n=sp.BytesToRead;bytebuf=new byten;sp.Read(buf,0,n);/1.缓存数据buffer.AddRange(buf);/2.完整性判断while(buffer.Count=4)/至少包含帧头(2字节)、长度(1字节)、校验位(1字节);根据设计不同而不同/2.1查找数据头if(buffer0=0x01)/传输数据有帧头,用于判断int len=buffer2;if(buffer.Count else/帧头不正确时,记得清除buffer.RemoveAt (0);在方法二中,有一句“执行其他代码,对数据进行处理”,如果这些代码涉及到主线程的控件比如Label,TextBox,就要涉及跨线程访问控件的问题。 (串口的DataReceived方法会创建新线程,这在本文开始时已经说明)对于跨线程访问及更改控件属性,也有两种方法,下一篇文章再介绍。 本文不足之处还请各位大虾指正,本人尚在上学,学识太浅。 作者:杨少宁发表于xx-01-2111:30原文链接评论:2查看评论发表评论最新新闻白色版iPhone4或将于2月27日上市(xx-01-2112:11)谷歌高层电话会议公司策略不会有实质性改变(xx-01-2112:08)淘花网联手索尼等打造中国数字音乐交易平台(xx-01-2112:05)苹果iPad2或将在2月9日正式发布(xx-01-2111:47)Opera Mini用户数突破8500万(xx-01-2111:37)推荐我们的创业步伐网站导航博客园首页我的园子新闻闪存小组博问知识库折叠发给朋友发给朋友转到小组转到小组(打标签)(打标签)收藏已藏推荐已荐0推荐收藏分享Visual Studioxx扩展制作的心得基本功能篇1小时19分钟前背景几个月前我做了一个给Visual Studioxx增加背景图片的扩展,不过说实在的这个东西也是借鉴了日本人做的同类扩展。 没想到放出来之后有很多人对此感兴趣,我也因此决定增加配置对话框功能,免去手工配置文件的麻烦。 但是因为一些奇怪的原因,说好的功能一直没有去做,在这期间也有别人在此基础上进行改造(虽然有点无伤大雅的小小误会),受这件事情的刺激我决定完善这个扩展,让它成为一个说得过去的产品。 而在完善这个扩展的过程中也遭遇了种种的困难,为了让对这方面感兴趣的同学们以后少走弯路,我决定以博文为载体将解决这些问题的经验分享出来。 基本功能的实现我这个扩展到基本功能么,就是给Visual Studioxx里面的文本器增加背景图案,然后还要使用一个XML文件来保存这些配置。 原理呢,就是通过器修饰物扩展的实现,来在器中插入Canvas控件和Image控件(WPF),来绘制背景,效果呢大概就是这样通过Visual StudioSDK所提供的项目模板可以创建简单的器修饰项目,模板中实现的是一个紫色的方块,我们需要把它改造成我们需要的东西。 背景图片单纯的背景图片实现其实是很容易的事情,因为通过模板创建的项目就是使用Image控件来显示紫色方块的,只要设置好其Source属性,再设定其位置和一些其它的杂项属性就成了。 设置Source属性因为目标是图片文件,所以设置Source属性时的首选类型是BitmapImage。 不过BitmapImage的默认构造器会独占目标图片文件,因而导致程序运行过程中无法修改或移动目标图片文件。 解决这个问题的办法则是使用无参数的构造器,并且手工编写初始化步骤var bmp=new BitmapImage();bmp.BeginInit();bmp.CreateOptions=BitmapCreateOptions.IgnoreImageCache;bmp.CacheOption=BitmapCacheOption.OnLoad;bmp.UriSource=new Uri(value);bmp.EndInit();设定位置和大小项目的默认实现采用的是固定大小的Image控件,并将之放在右上角。 而对于我们采用的背景图片来说,可能放在其它位置更好,比方说我最喜欢的一张比较适合放在右下角。 只要让Image控件填满整个空间,的HorizontalAlignment和VerticalAlignment属性就可以了。 这里需要注意的是,ItaBackgroundImage把Image控件的位置坐标设置成了0,0,而当器大小改变(比方说缩放了Visual Studio的窗口)时这种设计会导致背景图片错位。 正确的方法应该是这样做Canvas.SetLeft(element,textView.ViewportLeft);要改变其位置也并不复杂,然后设置它Canvas.SetTop(element,textView.ViewportTop);element.Width=textView.ViewportWidth;element.Height=textView.ViewportHeight;adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative,null,null,element,null);墙纸图案和背景图片不同,墙纸图案通常是重复绘制来填充整个背景空间的,所以使用Canvas和ImageBrush来配合的效果比较好,ImageBrush的TileMode属性应该设置成None以外的项目。 不过使用过我之前发布的ItaBackgroundKyuu的同学可能会注意到,ItaBackgroundKyuu的墙纸图案是“固定位置”的,当文本进行滚动的时候墙纸并不会跟随着一起滚动,这样用起来会感觉很奇怪,因此我又花了些时间来研究让墙纸跟随文本一起滚动的办法。 通过调用AddAdornment时指定AdornmentPositioningBehavior.OwnerControlled可以初步达到这个目的。 纵向坐标偏移的问题如果改变了器的显示比例(Zoom),或者从非正常关闭中恢复Visual Studio时,器视图的坐标系可能会发生改变;如果这个时候向上滚动器,就会发现前面的部分并没有绘制墙纸图案,甚至还有可能会引发异常。 借助Reflector等手段研究了一番之后,并没有发现什么可以确定文本中第一行的纵向坐标的简单办法,不知道是不是搞错了探索的方向。 不过在这个过程中却发现器内部似乎是从某一行开始一行一行地累加行高,所以经过若干小时的尝试之后,最终我也采用了累加行高的办法,这部分是这样实现的private doubleGetFirstLineTop(IWpfTextView view)var fvLine=view.TextViewLines.FirstVisibleLine;double top=fvLine.Top;var ss=fvLine.Snapshot;int lastIndex=fvLine.Start;IWpfTextViewLine line;while(lastIndex0)line=view.GetTextViewLineContainingBufferPosition(new SnapshotPoint(ss,lastIndex-1);top-=line.Height;lastIndex=line.Start;return top;在ITextView的LayoutChanged事件中写入下面这样的代码,就可以让墙纸图案随着文本一并滚动了,而且改变显示比例也不会导致错位问题var tileTop=GetFirstLineTop(textView);Canvas.SetTop(tile,tileTop);/tile是用于呈现墙纸图案的Canvas控件var state=e.NewViewState;tile.Width=state.ViewportRight;tile.Height=state.ViewportBottom-tileTop;修饰层的呈现优先顺序修饰层以哪种优先级呈现会影响到修饰层中的修饰物件会遮挡住什么、可以被什么遮挡住。 修饰项目默认采用的修饰层是这样设定的Export(typeof(AdornmentLayerDefinition)Name(ViewportAdornment1)Order(After=PredefinedAdornmentLayers.Caret)TextViewRole(PredefinedTextViewRoles.Document)public AdornmentLayerDefinitioneditorAdornmentLayer=null;然而在实际使用中会发现我们的修饰层可能会意外地显示不正确,调试过程中可以发现在能满足Order(After=PredefinedAdornmentLayers.Caret)的前提下,我们的修饰层的呈现顺序并不确定,而是随机插入在其它修饰层之间的。 为了让它正确呈现,我们需要指定一个较为严格的顺序,比方说Order(Before=PredefinedAdornmentLayers.Outlining)这样我们的修饰物就总会出现在器的最底层了。 设置的存储为了省却一部分人在重装系统之后可能需要重新设置的麻烦,我把设置以XML文件的形式保存在了我的文档之中。 由于采用的是独立的XML文件,因此直接使用了XML序列化功能,而没有去使用.NET框架所推荐的ConfigurationSection设计。 这部分没有什么需要特别注意的技术细节,也不作过多的说明了。 后记这一次主要说的是实现基本功能时需要注意的技术细节,然而在完善它使其成为一款真正的产品的过程中还有很多其它方面的问题,这些问题以及解决的办法我也会在以后的博文中一一列举出来。 博文大致会写成这样的几篇设置对话框的实现;打包VSIX的心得;编程过程中遭遇的陷阱。 最后,附上我的扩展在Visual Studio扩展库上的下载页面链接visualstudiogallery.msdn.microsoft./zh-/2d4f653f-262a-4d3a-b42c-c6f8e35e777e发布在扩展库上就意味着安装扩展的用户以后都能及时收到更新。 需要注意的是,扩展名称已经从ItaBackgroundKyuu改成了KyuuBackground,名称上的改变导致之前版本的配置文件也不再起作用了,需要通过选项对话框重新设置。 作者:Nanas Lich发表于xx-01-2111:09原文链接评论:4查看评论发表评论最新新闻白色版iPhone4或将于2月27日上市(xx-01-2112:11)谷歌高层电话会议公司策略不会有实质性改变(xx-01-2112:08)淘花网联手索尼等打造中国数字音乐交易平台(xx-01-2112:05)苹果iPad2或将在2月9日正式发布(xx-01-2111:47)Opera Mini用户数突破8500万(xx-01-2111:37)推荐我们的创业步伐网站导航博客园首页我的园子新闻闪存小组博问知识库折叠发给朋友发给朋友转到小组转到小组(打标签)(打标签)收藏已藏推荐已荐0推荐收藏jQuery1.5的新特征subclassjQuery插件机制的教赎1小时24分钟前感觉jQuery1.5最大的改变有两个,jQuery子类与异步列队,本文只谈jQuery子类。 首先要明白为何要推出此功能,是强化它那基本为零的OO功能吗?不是,从下面的源码你应该知道它不是让你自定义类。 但这也是个愚蠢的问题,因为这样,这方法就叫Class,而不是subclass。 subclass:function()function jQuerySubclass(selector,context)return newjQuerySubclass.fn.init(selector,context);jQuerySubclass.superclass=this;jQuerySubclass.fn=jQueryStotype=this();jQuerySubclass.fn.constructor=jQuerySubclass;jQuerySubclass.subclass=this.subclass;jQuerySubclass.fn.init=function init(selector,context)if(context&context instanceofjQuery&!(context instanceofjQuerySubclass)context=jQuerySubclass(context);return jQuery.fn.init.call(this,selector,context,rootjQuerySubclass);jQueryStotype=jQuerySubclass.fn;var rootjQuerySubclass=jQuerySubclass(document);return jQuerySubclass;,我想它真正的用意是为了改善其插件机制。 jQuery的插件是很容易开发,随便在其原型链上添加个方法就叫称“插件”,因此jQuery的插件很多,垃圾插件也很多,由于停止更新变成垃圾的也很多。 jQuery.fn.garbage=function()alert(这是垃圾插件!)当然这是在最理想的情况下,插件才这么简单(好像一个函数算一个插件也蛮多的)。 比如你开发一个插件,然后你同事也开发了一个同名的插件,这时出问题吧。 还有这种情况(function($)/插件一$.fn.extend(a:function()/插件的主体this.b(),b:function()/辅助函数)(jQuery);(function()/插件二$.fn.extend(c:function()/插件的主体this.b(),b:function()/辅助函数)(jQuery);这时这两个插件混用就有问题了,插件一的b与插件二的b可能不是一个东西,这机率还很大,因为插件一可能是美国的菜鸟开发,插件二是德国的菜鸟开发的,而且外国人都非常喜欢把他们的插件放到jQuery官网的插件展示区,国内的懒鬼兼菜鸟就很容易踩雷了。 插件混乱之灾随着jQuery的流行日益严重,由于jQuery易学易用,公司前端不够人手,随便抓个后台就行了。 于是前端也像中国楼讪那样出现泡沫了,一个页面引用N个插件,满屏的选择器,维护成本超高,近乎不可能。 归根结底,问题是大家都在污染jQuery与jQuery.fn这个两个对象,就像以前大家都爱到全局作用域那里拉屎那样。 全局作用域是公厕,去那儿是不可避免的,但我们可以用子类来转移jQuery,jQuery.fn的负担。 在jQuery1.5中,我们就应该这样写插件。 var MyjQuery=jQuery.subclass();MyjQuery.fn.writeHello=function()this.text(Hello World);MyjQuery(p).writeHello();由于MyjQuery是jQuery的子类,因此拥有其所有能力,链式操作一样没问题。 MyjQuery(div).css(border,1px redsolid).writeHello();我们还可以对jQuery原有方法进行修改,不用因为某些隐性bug而改源码了MyjQuery.fn.text=function(val)var orig=jQuery.fn.text;if(typeof val=string)return orig.call(this,!+val+!);elsereturn orig.apply(this,arguments);MyjQuery(.aaa).text(text);MyjQuery(.aaa).text();/!text!/不影响jQuery自身jQuery(.aaa).text(text);/text当然这也带来一个问题,插件都变为绑定到新的命名空间上了,重新跑到全局作用域上拉屎因此少用插件,提高自身的javascript(非jQuery)能力才是基本。 作者:司徒正美发表于xx-01-2111:04原文链接评论:0查看评论发表评论最新新闻Eric Schmidt说xx是Google移动之年(xx-01-2111:09)传IE9RC候选版已开发完成(xx-01-2111:08)盛大金酷游戏筹备国内上市,CEO称正寻找券商(xx-01-2111:00)金山网络拟推合并后首款新品涉足互联网新领域(xx-01-2110:54)Groupon入华或推高团购行业成本(xx-01-2110:51)推荐我们的创业步伐网站导航博客园首页我的园子新闻闪存小组博问知识库折叠发给朋友发给朋友转到小组转到小组(打标签)(打标签)收藏已藏推荐已荐0推荐收藏实战篇-通用的页面列表导出Excel控件1小时28分钟前首先,先上下图片,好理解一下今天要讲内容第一张图第二张图说明在很多系统中,或者是一些网站的后台,包括秋色园的后台,通过都会有一些相同的工具栏目,比如上面的“导出”按钮,由于分布在系统大量的列表中,因此,如何以最简洁快速的方式实现这种功能,节省开发时间,就是今天以下要介绍的内容了。 接着我们再看一下点击“导出”按钮时出现的导出功能打开导出的Excel说明从以上四张图片中,所要说明的问题是“导出”功能在N个界面中重复出现,如何实现“导出”功能的代码只写一次,就能在任意的界面中,实现导出当前页面列表的功能。 下面正文讲解如何实现一实现思路对于列表的导出,有以下两种方式1从客户端取数据导出在我的同事负责的一个基于ExtJs开发的系统中,是在客户端进行导出形成报表的,当然,使用这种方式,他有他的系统使用场景前提,即是每次查询都显示所有信息,不进行分页,所以不需要再提交到服务端再次查询,直接从客户端取数据即可以导出。 当然缺点就是对于分页显示的数据,只能导出当前页,因此只适用于一次显示所有数据的场景下。 2从服务端取数据导出由于相当多的时候,列表总是分页的,因此,需要重新提交到服务端查询所有数据,然后进行输出,如果只针对一个页面进行处理,通常写代码考虑的可以少一点,不过今天要实现的功能,只需要把控件往里一拖,即可自动实现导出功能,无需在页面写任何代码,因此,需要有一些标准的约定出来配合一下。 那具体实现的思路方式如何?其实思路很简单,只要约定绑定列表的方法名称和列表控件默认的ID即可。 简单的说,点击“导出”按钮时,可以通过反射,进行重新绑定,然后通过重新绑定后的控件ID,取得内部生成的html,进行Excel导出即可。 二实现步骤具体的实现步骤如下1新建用户控件,往里拉一个“导出”按钮。 2在“导出”按钮点击事件中寻找约定的列表控件如rptList,找到后反射调用约定的方法如“BindList,调用后rptList将被填充完内容。 3读取rptList控件的内部html,进行导出。 三完整示例实现代码1新建示例网站项目如ExcelExportDemo2往里新建用户控件Export.ascx示例中只放一个“导出”按钮html如下点击时的后台代码如下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年规划投资专业考试题库及答案
- 2025年广西中小学教师招聘考试教育综合知识试题及答案解析
- 化验员基础考试题及答案
- 芜职美育课考试题及答案
- 东北三省二模考试试题及答案
- 《科目一》机动车驾驶员考试试题与参考答案(2025年)
- 人力六大模块笔试题及答案
- 心力衰竭中医护理试题及答案2025年解析
- 渠道经理笔试题库及答案
- 2025年一建建筑工程真题答案21
- 医院财务管理年度工作报告
- 灌溉水量平衡分析报告
- 高标准基本农田建设项目初步验收报告
- (2025版)国内旅游“一日游”合同(示范文本)
- 连云港市辅警考试题库2025
- 乡村执业助理试题及答案
- 2025年成人高考专升本医学综合真题及答案
- 2025-2026学年一年级上册统编版道德与法治教学计划
- 国开2025年秋季《形势与政策》专题测验1-5答案
- 急性STEMI PCI术冠状动脉内溶栓共识解读
- 陪诊师备考指南试题及答案
评论
0/150
提交评论