产品体验 – 扫描全能 | 学生党、工作狂必备的公文管理工具

一、产品主题音信


字面领会:跑圈,运行循环

二、产品介绍

要旨职能

1.保持程序的到处运行
2.处理App中的各类风云(触摸,监听,定时等等)
3.节省CPU资源,进步程序性能:该工作时工作,该以逸击劳时休息

在面前早已说了,
程序启动时,自动开启runloop,来接济使用,循环执行下去,不被销毁.

RunLoop对象
iOS中有2套API来访问和应用RunLoop
1.Foundation —->NSRunLoop
2.Core Foundation —->CFRunLoopRef

3.NSRunLoop是按照CFRunLoopRef的一层OC包装,所以明白RunLoop内部结构,需求多钻研CFRunLoopRed层面的API(Core
Foundation层面)

RunLoop与线程
1>每一条线程都有唯一的一个与之对应的RunLoop对象
2>主线程的RunLoop已经自行创立好了,子线程的RunLoop需求积极创立
3>RunLoop在首先次得到时创制,在线程为止时销毁.
(主线程,一般不会销毁,所以主运行循环也不会被灭绝)

获取RunLoop对象
1>Foundation

[NSRunLoop currentRunLoop];// 获取当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象

2>Core Foundation

CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
CFRunLoopGetMain(); // 获得主线程的RunLoop对象

2.1 产品背景

随着科学技术的进步,人们处理日常事务变得更其复杂,音讯流之间的漂泊也更趋向电子化,传统的纸质等实体文件难免造成音讯周转的驻留与忙绿。所以,一款使人人能够将各项文件转为电子格式,同时能够随时四处使用与管理,那样一款工具无疑是升格人们学习、工作、生活效能的利器。

RunLoop处理逻辑—-官方版

Snip20150928_4.png

Run Loop的事件队列
网友版

Snip20150928_5.png

2.2 产品简介

2亿人在用的无绳电话机扫描仪、文档管理工具,通过高清的图像处理技术,它亦可活动切除文档背景,生成高清PDF、JPEG或TXT文本等格式的文件,仍能经过邮件发送、连接打印机、发传真、存到云端共享,并且支持多设备查看。

RunLoop相关类

Core Foundation中关于RunLoop的5个类
1.CFRunLoopRef //用来创设runloop
2.CFRunLoopModeRef // 设置格局
3.CGRunLoopSourceRef // 装置资源
4.CFRunLoop提姆(Tim)erRef // 安装定时器
5.CFRunLoopObserverRef // 装置监听者

Snip20150928_7.png

2.3 产品一定

为私家、中小公司、政党部门、教育部门提供只可以文档管理方案。

CFrunLoopModeRef

1.表示着runloop的运作形式
1>一个RunLoop中包括若干个Mode,每个Mode又包涵若干个Source/提姆(Tim)er/Observer
2>每一次Runloop启动时,只可以制定一个Mode,那些Mode被称做CurrentMode
3>若是急需切换Mode,只好退出Loop,在重新制定一个Mode进入
4>那样做首即使为着分隔开不一致组的Source/提姆(Tim)er/Observer,让其互不影响

/############此地大家不做深切钻研#############/
近期我们说说RunLoop的现实使用

2.4目标用户群画像

2.4.1 目的用户属性

率先扫描全能王作为一款工具类产品是,在男女比例上的分布相比平均。

而在年纪则第一分布在中青年,可以推测出一大半为学习者和行事人群,他们平常的就学和办事生活中留存多量的文本,有电子版文件属实是丰裕省时省力。并且,对于学员来说没有收入去购买价格高昂的扫描仪,白领们不仅有大气的文本需要处理、共享,也很难在有要求时就能选用扫描仪。

组合地方分布与用户的开销劲量水平,能够推测用户首要集中在比较发达的一二线城市,这几个地带的用户正处在人生上升期,必要有一款升高效能的工具类软件辅助工作与生存。

2.4.2 目的用户序列

白领与商务人士:扫描合同、文件;实时通过传真、邮件共享文件;方便名片管理;

学生:扫描同学笔记、课堂白板、PPT、表单;并得以传给电脑编辑文档;

设计师:扫描保存设计手稿,可上传至电脑举办持续创作,随时捕捉灵感初现时的无畏设想;

漫画党:扫描漫画,方便上传网盘,分享给同好;

观光胃痛友:备份扫描护照、驾照等关键证件,以及旅行布置、地图扫描存手机,不必顾虑出乎预料的无网络环境或声明须求;

出差/购物:出差发票、购物小票都能够更及时的备份。

定时器

NSRunLoop的两种形式:
1.NSDefaultRunLoop 默许情势
2.UITrackingRunLoop 界面跟追,用于scrollView拖拽,滑动
3.NSRunLoopCommonModes 不是一个一定的情势,
只是一种标志,相比综合的一种格局

在定时器中的应用

// 默认加入主运循环, 默认的模式为  default
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(time) userInfo:nil repeats:YES];

    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(time) userInfo:nil repeats:YES];

    NSTimer *timer1 = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(time1) userInfo:nil repeats:YES];
    // 点击屏幕触发事件,  但如果一旦有空间支持拖住手势时,当前模式就会改变, 原来的runloop被释放, 创建新的runloop来支持拖拽 
    [[NSRunLoop currentRunLoop] addTimer:timer1 forMode:UITrackingRunLoopMode];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

    // 打印可以的到 当前的 runloop 的所有信息。 runloop 跑圈。
    NSLog(@"%@",[NSRunLoop currentRunLoop]);
}

当远在那种形式下, 那种的定时器,就会运行, CommonModes
是默许和拖拽三种方式下都得以运作, Tracking唯有在拖拽情势下才可以运作.
default只有在默许情状下运作,没有其余交互行为时运作.

运用GCD来创造一个定时器
(默许不受mode的震慑,什么形式下都可以运作)

   /**
     *  1、创建一个定时器 (设置的队列,决定回调的方法 在哪一个线程中实行。)
     *  2、指定开始事件和间隔时间,以及精确度
     *  3、指定了回调方法
     *  4、开始定时器
     */
    /**
     *  GCD定时器 比较准确。  如果设置的偏差越小,越精确,消耗性能越大。 此定时器,不受mode的影响。
     *
     */
    dispatch_queue_t queue = dispatch_queue_create("ლ(′◉❥◉`ლ)", DISPATCH_QUEUE_CONCURRENT);
// 局部变量, 必须使用属性将其绑定  
 dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

    self.timer = timer;

    /**
     *  第一个参数:需要给个定时器进行设置
     *  第二个参数:开始时间
     *  第三个参数:间隔时间
     *  第四个参数:偏差(允许偏差)
     *  第五个参数:回调方法
     */

    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);

        dispatch_source_set_event_handler(timer, ^{

            NSLog(@"1------%@",[NSThread currentThread]);
        });
        // resume 继续,重复执行

        dispatch_resume(timer);

2.5 功用介绍

【手机上的扫描仪】手机拍文档,自动删除杂乱背景,生成高清JPEG图片或PDF文件。多种图像优化形式,可手动调节图像参数,用手机即可将纸质文件,连忙转为清晰的扫描件。

【图片转文本神器】智能OCR文字识别,手机拍纸质文档,搜上面的字就摸索到对应文件。高级帐户还可将图片中的文字识别导出为可以编制、复制、保存或分享Text文本。可甄别普通话、法语、克罗地亚语、爱尔兰语等16种语言,也是一种外理学习翻译神器。

【随身指引的文件库】手机、平板、电脑,多配备随时查看管理文档。标签归类,手写批注,文档加密,方便有序,高效安全。

【有线打印、全世界传真】支撑有线打印,并且可以向全球30多个国家和地点发送传真。

【文档共享、高效合营】Office
好助手,随手扫描的其他文档,都可邀请对象、同事为合营人,共同查看、评故事集档。还可由此邮件、链接、或虎扑、微信等应酬帐户分享给心上人。


品味开启亲的RunLoop

- (void)viewDidLoad {
    [super viewDidLoad];  NSLog(@"++++++++++____________++++++++++");
    NSThread *thread = [[NSThread alloc]initWithTarget:self  selector:@selector(thread) object:nil]; 
    [thread start];
}
- (void)thread
{
  NSLog(@"%@",[NSThread currentThread]);
    // 地址与主运循环地址不一样  ,说明是开启了新的循环。
    NSLog(@"%@", [NSRunLoop currentRunLoop]);
    NSLog(@"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
    NSLog(@"%@",[NSRunLoop mainRunLoop]);
}

Snip20150930_5.png

Snip20150930_7.png

可以一目了解的看出来,已经拉开了新的RunLoop

/########用代码解释RunLoop的逻辑进度#######/
CFRunLoop中给我们提供了用来监听RunLoop状态的不二法门

/*

 typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
 kCFRunLoopEntry = (1UL << 0), 0 进入循环  创建
 kCFRunLoopBeforeTimers = (1UL << 1), 2 处理定时器才做之前
 kCFRunLoopBeforeSources = (1UL << 2), 4 处理事件源,输入源之前 
 kCFRunLoopBeforeWaiting = (1UL << 5), 32 休眠之前  释放
 kCFRunLoopAfterWaiting = (1UL << 6),  64 休眠以后  创建
 kCFRunLoopExit = (1UL << 7),          128 循环退出  释放
 kCFRunLoopAllActivities = 0x0FFFFFFFU    所有事件
 };


 mode
  kCFRunLoopDefaultMode; 默认模式
  kCFRunLoopCommonModes; 通用模式

 */

 // 给循环加监听者

    // 创建监听者内存
    CFAllocatorRef alloc = CFAllocatorGetDefault();

    /**
     *  监听者的创建
     *
     *  @param alloc                   创建监听者所处的内存
     *  @param kCFRunLoopAllActivities 所有要监听的状态
     *  @param YES                     是否每次都监听
     *  @param 0                       优先级 “0”(一般传0)
     *  @param observer
     *  @param activity                回调函数 : 根据状态, 
     *
     *  @return <#return value description#>
     */
     CFRunLoopObserverRef obeserver =  CFRunLoopObserverCreateWithHandler(alloc, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        switch (activity) {
            case kCFRunLoopEntry:
                NSLog(@"进入循环");
                break;
            case kCFRunLoopBeforeTimers:
                NSLog(@"处理定时器才做之前");
                break;
            case kCFRunLoopBeforeSources:
                NSLog(@"处理事件源,输入源之前");
                break;
            case kCFRunLoopBeforeWaiting:
                NSLog(@"休眠之前");
                break;
            case kCFRunLoopAfterWaiting:
                NSLog(@"休眠以后");
                break;
            case kCFRunLoopExit:
                NSLog(@"循环退出");
                break;
        }
    });



    /**
     *  给runloop加监听者
     *  第一个参数:将监听者加给哪个循环
     *  第二个参数:添加哪个监听者
     *  第三个参数: 监听者添加到那个模式中
     */
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), obeserver,kCFRunLoopDefaultMode);


    // 任何时候 自己手动添加的 监听者  都有要去除掉. (release remove)
    CFRelease(obeserver);
}

/**
 *  系统默认进入的时候,就会给主线程创建一个主运循环。(跑圈)目的在于,保证程序能一直的运行下去。  它的运行也很有意思,它里面包含很多的模式Mode,比较常用的有:默认模式(default), 拖拽模式(tracking),公用模式(common)。 在同一时刻的时候它只会执行其中的一种模式。如果切换模式,就会被释放,然后再创建新的,执行新的模式的。 (此时的释放,并不是被毁掉)。

    mode 里面包括: source -- (类型:NSSet)一系列的事件
                        handle port ---- 系统接口输入(回调)
                        custom ---- 用户自定义方法调用
                        my Selector ---- 调用[self performSelector:  ];
                  timer -- (类型:NSSArray)一组定时器事件
                  observer -- (类型:NSArray)多少个事件由多少个监听者



    CFRunLoop的相关类:CFRunLoopRef
                     CFRunLoopModeRef
                     CFRunLoopSourceRef
                     CFRunLoopTimerRef
                     CFRunLoopObserverRef     也是根据 runloop 以及mode内容 设定的。
 */
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    void (^block)() = ^{

        NSLog(@"123");

    };
    block();

    NSLog(@"1-----%@",[NSThread currentThread]);
}

起步程序, 点击显示器控制台出口
![Uploading Snip20150930_8_112122.png . . .]

Snip20150930_10.png

/######机关释放池#######/
在MRC向ARC过渡的一时, 引入了一个新的词汇,自动释放池,
故名思议,就是活动释放的意思,
此前俺们知晓为自动释放内存当爆发一个对象是retaincount加1,必须release三遍,才能让对象释放,后来当有了电动释放池,放入自动释放池中的对象,不必手动release,当出池的时候,就会活动举行释放.
不过那是在MRC中我们得以看看自动释放池,现在ARC中我们看不到自动释放池的时候它是怎么运行的<autoreleasePool.
>

// 这是根据苹果官方文档进行的解释
/*
     自动释放池什么时候创建和释放
     1.第一次创建, 是在runloop进入的时候创建  对应的状态 = kCFRunLoopEntry
     2.最后一次释放, 是在runloop退出的时候  对应的装 = kCFRunLoopExit
     3.其它创建和释放
        * 每次睡觉的时候都会释放前自动释放池, 然后再创建一个新的

     _wrapRunLoopWithAutoreleasePoolHandler activities = 0x1,   
     1  = kCFRunLoopEntry  进入loop  创建自动释放池

     _wrapRunLoopWithAutoreleasePoolHandler activities = 0xa0,  
     160 = kCFRunLoopBeforeWaiting  即将进入睡眠 ,先释放上一次创建的自动释放池, 然后再创建一个新的释放池
     +
     kCFRunLoopExit 即将退出loop  释放自动释放池

     */

/########常驻线程#########/
为什么要来介绍常驻线程,
因为我们清楚,在子线程执行操作时,当操作一旦实施完的话,就会立马被移除,
对于部分节奏或者小而屡屡的操作,如果一贯创设和释放子线程,是很是耗内存的,
多以给子线程添加循环,这样它就和主运循环一样,
用的时候被擢升,不用的时候去睡觉,那样节约了资源的消耗

// 子线程内部直接操作
 // 对于新开辟的循环,必须加入 source(输入源 事件,用户事件,可不是系统自己的方法触发的) 或者 timer (定时器) ,这样才能开启循环。 否则,循环一被创建,就会被销毁。
//    [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

    [[NSRunLoop currentRunLoop] addTimer:[NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timer) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];

    [[NSRunLoop currentRunLoop] run];

    NSLog(@"%@--------%@",str,[NSThread currentThread]);
- (void)timer
{

    NSLog(@"-------");

}

三、产品分析

3.1产品结构图

3.2主导功效流程图

CS扫描全能王即是手机上的扫描仪,通过视频或相册扫描图片,转化为电子版存储在软件和手机本地,并提供后续识别文字内容、多种渠道共享的功用。

3.3 版本音信

3.3.1 版本迭代音信

环视全能王作为一款成效工具类App,基本有限帮助着每个月起码迭代优化一回的手续,可以看出每隔两代,就会生产新的意义,并且在此基础上连发维稳升高性能。

3.3.2 下载量变化

选过去一年为取样周期
下载量预估统计为:1194.6w,可以算出日均下载量约为3.27w。

从上图可以寓目,下载量的内忧外患基本保持在1w~5w左右,通过比较版本迭代景况,可以窥见,随着新本子的换代,下载量往往会日渐回暖。比如在v4.1.0页面大改版后,下载量迎来了又一波高峰。

3.3.3 评价意况

相同以过去一年为取样周期,扫描全能王的好评占据了五万多条评论里的96%。

3.4 功效点分析

3.4.1 手机上的扫描仪

照相机直接拍摄扫描和相册导入扫描两种方法,考虑到了分化应用景况下的用户接纳要求。相机拍摄考虑到了即用即走的用户,而相册导入也为用户后续才发生须求的操作提供了也许。

不相同于相机拍摄的模糊与新闻混乱,通过扫描全能王扫描文件,不仅也是随扫随用随生成,而且多余的背景音讯会被切开,电子扫描件格外清楚。同时,有多种图像处理方式可供用户采取,使差别境况下素描的文件都可以透过调试更切合用户的处理目标。

扫描全能王还其它提供了证书情势的扫视情势,以身份证为例,按照提醒顺序扫描正面、反面后,它会自行拼成一张与纸张同比例缩放的身份张正反面复印件,直接打印即可。但是这一效果仅为付成本户开放,免开销户可以感受这一效应,但如若须要保留使用,便会弹出付费弹窗。

3.4.2 图片转文本神器

OCR (Optical Character
Recognition,光学字符识别)是指电子装置(例如扫描仪或单反相机)检查纸上打印的字符,通过检测暗、亮的格局规定其形状,并将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技巧。

经过这一职能,扫描全能王会按照选拔的辨识语言,自动输出文字识别结果,然而不尽然准确。比如上图右上角的折叠菜单按钮,它识别成了一二三……

一如既往,倘诺想要导出、分享、核查分辨结果,也是内需提高为付费用户的。

总的看,这几个功用解决了诸多用户在就学或办公室中的一个痛点,就是将部分不可能复制的图形文字音信,更快地倒车为文档,那一点功用大大节省了人力和时间资产。

3.4.3 文档管理与共享

再三文件是离不开传输与共享的。在那一点上,扫描全能王就像一个文档管理库,文档可以生成txt、链在线链接、JPG文件、PDF文件等次第格式方式,然后用户之间可以经过电子邮件、传真、微信和讯等第三方社交工具举行共享,邀请用户一起协作,打破工具、平台和环境的封锁,用户之间可以互相查看、评论,有效幸免麻烦的优盘拷贝方式,更连忙更迅捷。

还要,每一份文档都可以陆续扫面新的电子件参与文档,并且支持自定义编辑修订,如编辑标题、添加标签、添加水印、添加批注等操作。

标签也足以统一开展管理,使文档管理更精致智能。同时,手机、电脑、平板等多终端同步革新文件,文件管理更具实时性,一处修改多处一起,省去了文本整理的重新操作,并且辅助直连打印机,不再受限于设备的羁绊。

文本夹可共享,共享方法还提供了加密的情势,使文档更安全。


四、总结

4.1 优化提议

4.1.1 OCR识别优化

在当前最新的扫视全能王版本中,用户须要经过点击文件夹-拔取文件-确定文件中的某一页-点击OCR,再经过甄选一些识别或是整页识别,才足以初叶应用该意义。适当回落职能层级,才会使用户发现这一效果、尝试利用这一成效、从而发现功效优势进而付费那一个作为存在更大的或是。

除此之外,提高OCR的管事识别能力,下落拒识率,进步准识率,有效判断图标与文字信息的差别,才能使用户更乐于为其付费使用。

4.2 小结

即使扫描全能王专门为付开销户开放了有些更尖端的机能,可是其实它强大的免费作用,就曾经够用满意半数以上用户的应用要求,所以在两日的感受时光内,我实在没有意识怎么显明的欠缺。

用作一个升级成效的工具类软件,扫描全能王不论是在用户学习用度、使用流畅度、文件精准专业度,都做得不得了科学。