葡京在线开户产品体验 – 扫描全能 | 学生党、工作狂必备的文件管理工具

一律、产品核心信息


字面理解:跑圈,运行循环

老二、产品介绍

中心打算

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.CFRunLoopTimerRef // 安装定时器
5.CFRunLoopObserverRef // 装置监听者

Snip20150928_7.png

2.3 产品定位

为民用、中小企业、政府部门、教育机构提供只能文档管理方案。

CFrunLoopModeRef

1.意味在runloop的运作模式
1>一个RunLoop中带有几只Mode,每个Mode又富含多独Source/Timer/Observer
2>每次Runloop启动时,只能制定一个Mode,这个Mode被称做CurrentMode
3>如果用切换Mode,只能退Loop,在重新制定一个Mode进入
4>这样做要紧是以分隔开不同组的Source/Timer/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 小结

则扫描全能王专门为付费用户开放了有的又尖端的功用,但是其实它强大的免费功能,就曾够满足大部分用户之下要求,所以当有限天之感受日外,我真的没察觉什么明显的贫。

作一个升格效率的家伙类软件,扫描全能王不论是在用户学习成本、使用流畅度、文件精准专业度,都召开得不可开交不利。