<?xml version="1.0" encoding="utf-8"?> <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content"> <!-- by lixiaodaoaaa welcome to my Blog :http://blog.csdn.net/lixiaodaoaaa --> <!--腾讯微博 欢迎关注:http://t.qq.com/lixiaodaoaaa/ --> <LinearLayout android:layout_marginTop="40dp" android:layout_marginBottom="40dp" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/item1" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/item2" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/item3" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/item4" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/item5" /> </LinearLayout> </HorizontalScrollView>
“我本人就是Dropbox的重度用户。在美国的时候,我家里最夸张的时候一共有六台电脑在用,我经常为了找不到某个文件到底放在哪台电脑里而头痛,Dropbox的出现让我觉得它正是我想要的东西。”王淮顿了顿,接着说道,“不过,即便是这样,我也不是它的付费用户。”
王淮曾是Facebook的早期员工,2011年9月离开Facebook之后回国成为天使投资人。他对南都记者说的这段话,既证明了云存储服务在个人市场上真真实实存在的需求,也说出了这一市场的尴尬所在。
前期的服务器架设已然烧掉了大量资金,但个人用户的付费习惯还没有养成,再加上国内的几家互联网和IT巨头纷纷祭出“免费”大旗。云存储领域的竞争会像当年的视频行业一样,成为一场比拼资本实力、“剩者为王”的资源消耗战吗?
内外厮杀云存储
一年多前,美国云存储公司Dropbox的用户数在短短半年多时间里翻了五倍的消息,带热了国内云存储领域的创业潮。不过,与其他版本的“CopytoChina”故事不同的是,在云存储这块沙场上厮杀的,不光有诸如最早的115网盘、酷盘、云诺、坚果云等一众创业小团队,还挤进了包括百度、腾讯、华为、金山、360在内的多家互联网和IT“巨头”。
在众多被热捧的创业概念中,巨头们为什么独独对“云”趋之若鹜呢?
Pre Angel投资人王利杰向南都记者解释,随着智能手机、平板电脑等多种智能终端的普及,个人用户所拥有的数据量正在成几何倍数增长,无论是从存储的安全性,还是随取随用的便利性上来说,将数据上传存储到云端而非进行本地收藏,已是大势所趋。
换句话说,当人们习惯用不同的终端随时随地调取储在云端的数据时,存储着大量数据的云就成了整个移动互联网的基础,而“谁拥有云,谁才能真正称得上是在移动互联网上占据了一席之地”,这就是任何一家大公司都不愿意错过“云”机会的根本原因。
在海外市场上,亚马逊、谷歌、微软等几家大公司早在数年之前就开始打造云计算的基础。以亚马逊为例,其在2006年利用自身其他服务的剩余资源面向开发者推出的S3云存储服务,由于其使用方式极为灵活,用户可以真正做到“用多少资源付多少钱”,才使得诸如Dropbox这样的创业公司能够“轻资产”起步,基于S3为个人用户提供文件同步和分享服务。同时,Dropbox本身又是开放的,可以对接各类更垂直细分的应用,从而形成了一个立体的“云”生态。
然而,国内的市场情况却截然不同。根据北大市场与媒介研究中心的一份调查报告所说,“云”概念自2008年左右被引入国内,但真正开始在市场中加以应用和普及却是等到了2010年底。对于大公司来说,云本身的重要性,加上错过了最初的发展时机,让他们更急于推出一个“高大全”的云服务平台,将从基础设施到终端产品,甚至包括垂直应用一网打尽,同时再祭出“免费”大旗来吸引个人用户,试图将整个市场快速推起。
但这对创业公司来说,却是内外叠加的双重打击。一方面,他们不像Dropbox等海外同行一样有“巨人的肩膀”可踏,必须自己投入大量的前期资金购置服务器与带宽;另一方面,巨头们带动的“免费”热潮,更削减了国内个人用户对付费服务的热情。即使创业公司有强大的融资能力做依托,允许其投入大量资金,在短期内将市场需求撕开一道口子,起码在三五年内也无法将烧出去的钱重新赚回来,这无论是为其之后的续融资还是整体的商业模式都画上了一个大大的问号。
UITableView在iOS开发中会经常使用,对于行数很多的UITableView,可以通过UITableViewCell的重用,来保证执行效率。源码下载点击这里。
我们通过代码来探索UITableViewCell重用的实现,下面是一段使用UITableView的代码,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"myCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewStyleGrouped reuseIdentifier:@"myCell"]; UITextField *tf; tf = [[UITextField alloc] initWithFrame:CGRectMake(100, 10, 150, 40) ]; tf.delegate = self; tf.borderStyle = UITextBorderStyleRoundedRect; [cell addSubview:tf]; [tf release]; cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row]; } // Configure the cell... return cell; }我们期待的是上下拖动UITableView,结果是这样
然而结果确实我们上下拖动后,都是
我们回到dequeueReusableCellWithIdentifier的定义
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.使用委托来获取一个已经分配的cell,代替分配新的一个;在这个例子中,将当前屏幕下创建的Cell都先加入到对象池,这是对象池的內Cell的个数大致是8,当我们滑动TableView时,将使用dequeueReusableCellWithIdentifier方法返回对象,该方法通过
reuseIdentifier(“myCell”)在对象池中,查找之前已经放入的cell对象。
这时候就有了第一个,既然它重用出问题,就不让它重用,代码如下
NSString *CellIdentifier = [NSString stringWithFormat:@"myCell_%d",indexPath.row];对于每一行,设定不同的reuseIdentifier。
CocoaTouch的开发人员也很与时俱进,在iOS6.0,终于有了新的方法
//ios 6.0 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"myCell"; [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CellIdentifier]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; UITextField *tf; tf = [[UITextField alloc] initWithFrame:CGRectMake(100, 10, 150, 40) ]; tf.delegate = self; tf.borderStyle = UITextBorderStyleRoundedRect; [cell addSubview:tf]; [tf release]; cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row]; // Configure the cell... return cell; }我们先注册cell,然后再通过
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered
问题快被解决了,但是程序员总是有很多问题,比如现在的代码下,如果我们在UITextField输入了对应于textLabel的值(1、2、3、4。。。),再向下拖动,再拖回原来的位置,还可以看到UITextField內的数字么?我测试的结果是不能,我这里给出一个我的解决方法
//添加目标动作对,使其值改变时,自动保存至变量 [tf addTarget:self action:@selector(tfChange) forControlEvents:UIControlEventEditingDidEnd];