iOS开发中一些常见的并行处理
- NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
- context.persistentStoreCoordinator = self.persistentStoreCoordinator;
- context.undoManager = nil;
- [self.context performBlockAndWait:^
- {
- [self import];
- }];
- [lines enumerateObjectsUsingBlock:
- ^(NSString* line, NSUInteger idx, BOOL* shouldStop)
- {
- NSArray* components = [line csvComponents];
- if(components.count < 5) {
- NSLog(@"couldn't parse: %@", components);
- return;
- }
- [Stop importCSVComponents:components intoContext:context];
- }];
- ImportOperation* operation = [[ImportOperation alloc]
- initWithStore:self.store fileName:fileName];
- [self.operationQueue addOperation:operation];
- if(self.isCancelled) {
- *shouldStop = YES;
- return;
- }
- operation.progressCallback = ^(float progress)
- {
- [[NSOperationQueue mainQueue] addOperationWithBlock:^
- {
- self.progressIndicator.progress = progress;
- }];
- };
- self.progressCallback(idx / (float) count);
- NSInteger progressGranularity = lines.count / 100;
- if (idx % progressGranularity == 0) {
- self.progressCallback(idx / (float) count);
- }
- [[NSNotificationCenter defaultCenter]
- addObserverForName:NSManagedObjectContextDidSaveNotification
- object:nil
- queue:nil
- usingBlock:^(NSNotification* note)
- {
- NSManagedObjectContext *moc = self.mainManagedObjectContext;
- if (note.object != moc)
- [moc performBlock:^(){
- [moc mergeChangesFromContextDidSaveNotification:note];
- }];
- }];
- }];
- __weak id weakSelf = self;
- [self.operationQueue addOperationWithBlock:^{
- NSNumber* result = findLargestMersennePrime();
- [[NSOperationQueue mainQueue] addOperationWithBlock:^{
- MyClass* strongSelf = weakSelf;
- strongSelf.textLabel.text = [result stringValue];
- }];
- }];
- UIGraphicsBeginImageContextWithOptions(size, NO, 0);
- // drawing code here
- UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return i;
- // Warning: please don't use this code.
- dispatch_async(backgroundQueue, ^{
- NSData* contents = [NSData dataWithContentsOfURL:url]
- dispatch_async(dispatch_get_main_queue(), ^{
- // do something with the data.
- });
- });
- - (void)start
- {
- NSURLRequest* request = [NSURLRequest requestWithURL:self.url];
- self.isExecuting = YES;
- self.isFinished = NO;
- [[NSOperationQueue mainQueue] addOperationWithBlock:^
- {
- self.connection = [NSURLConnectionconnectionWithRequest:request
- delegate:self];
- }];
- }
- - (void)cancel
- {
- [super cancel];
- [self.connection cancel];
- self.isFinished = YES;
- self.isExecuting = NO;
- }
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection
- {
- self.data = self.buffer;
- self.buffer = nil;
- self.isExecuting = NO;
- self.isFinished = YES;
- }
- Concurrency Programming Guide
- NSOperation Class Reference: Concurrent vs. Non-Concurrent Operations
- Blog: synchronous vs. asynchronous NSURLConnection
- GitHub: SDWebImageDownloaderOperation.m
- Blog: Progressive image download with ImageIO
- WWDC 2012 Session 211: Building Concurrent User Interfaces on iOS
- @interface Reader : NSObject
- - (void)enumerateLines:(void (^)(NSString*))block
- completion:(void (^)())completion;
- - (id)initWithFileAtPath:(NSString*)path;
- @end
- - (void)enumerateLines:(void (^)(NSString*))block
- completion:(void (^)())completion
- {
- if (self.queue == nil) {
- self.queue = [[NSOperationQueue alloc] init];
- self.queue.maxConcurrentOperationCount = 1;
- }
- self.callback = block;
- self.completion = completion;
- self.inputStream = [NSInputStream inputStreamWithURL:self.fileURL];
- self.inputStream.delegate = self;
- [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
- forMode:NSDefaultRunLoopMode];
- [self.inputStream open];
- }
- - (void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)eventCode
- {
- switch (eventCode) {
- ...
- case NSStreamEventHasBytesAvailable: {
- NSMutableData *buffer = [NSMutableData dataWithLength:4 * 1024];
- NSUInteger length = [self.inputStream read:[buffer mutableBytes]
- maxLength:[buffer length]];
- if (0 < length) {
- [buffer setLength:length];
- __weak id weakSelf = self;
- [self.queue addOperationWithBlock:^{
- [weakSelf processDataChunk:buffer];
- }];
- }
- break;
- }
- ...
- }
- }
- - (void)processDataChunk:(NSMutableData *)buffer;
- {
- if (self.remainder != nil) {
- [self.remainder appendData:buffer];
- } else {
- self.remainder = buffer;
- }
- [self.remainder obj_enumerateComponentsSeparatedBy:self.delimiter
- usingBlock:^(NSData* component, BOOL last) {
- if (!last) {
- [self emitLineWithData:component];
- } else if (0 < [component length]) {
- self.remainder = [component mutableCopy];
- } else {
- self.remainder = nil;
- }
- }];
- }
iOS开发中一些常见的并行处理的更多相关文章
- iOS开发中一些常见的并行处理(转)
本文主要探讨一些常用多任务的最佳实践.包括Core Data的多线程访问,UI的并行绘制,异步网络请求以及一些在运行态内存吃紧的情况下处理大文件的方案等. 其实编写异步处理的程序有很多坑!所以,本文 ...
- iOS开发中常见的一些异常
iOS开发中常见的异常包括以下几种NSInvalidArgumentExceptionNSRangeExceptionNSGenericExceptionNSInternallnconsistency ...
- iOS 开发中常见的设计模式
最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...
- 总结iOS开发中的断点续传那些事儿
前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- iOS开发中常见问题集锦
在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...
- iOS开发UI篇—常见的项目文件介绍
iOS开发UI篇—常见的项目文件介绍 一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要 ...
- 简述 Ruby 与 DSL 在 iOS 开发中的运用
阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain Specific Language) 翻译成中文就是:"领域特定语言".首先,从定义就 ...
- 深入理解 iOS 开发中的锁
来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...
随机推荐
- windowsXP用户被禁用导致不能网站登录
1.查看系统事件,发现弹出如下的错误 2.根据上面的错误,我们很容易就可以判断是禁用了账户引起的 2.1后面进入计算机管理,再进入用户管理 2.2双击点开Internet来宾用于,发现此用户已经停用了 ...
- python __setattr__, __getattr__, __delattr__, __call__
python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = ...
- [WinAPI] API 10 [创建、打开、读写文件,获取文件大小]
在Windows系统中,创建和打开文件都是使用API函数CreateFile,CreateFile通过指定不同的参数来表示是新建一个文件,打开已经存在的文件,还是重新建立文件等.读写文件最为直接的方式 ...
- hibernate 问题集
1.Could not obtain transaction-synchronized Session for current thread 解决方法: 在web.xml中加入如下配置: <fi ...
- 在DOS下的DEBUG命令的详细用法
在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...
- paip.sqlite 管理最好的工具 SQLite Expert 最佳实践总结
paip.sqlite 管理最好的工具 SQLite Expert 最佳实践总结 一般的管理工具斗可以...就是要是sqlite没正常地关闭哈,有shm跟wal文件..例如ff的place.sqlit ...
- Struts2入门2 Struts2深入
Struts2入门2 Struts2深入 链接: http://pan.baidu.com/s/1rdCDh 密码: sm5h 前言: 前面学习那一节,搞得我是在是太痛苦了.因为在Web项目中确实不知 ...
- HtmlDocument
HtmlDocument HtmlDocument类对应着一个HTML文档代码.它提供了创建文档,装载文档,修改文档等等一系列功能,来看看它提供的功能. 一.属性 int CheckSum { get ...
- 一致性hash和solr千万级数据分布式搜索引擎中的应用
互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库.在这样严峻的条件下,一批又一批的创业者从创业中 获得成功,这个和当前的开源技术.海量数据架构有着必不可分的关 ...
- EWM 强大的数据修复功能
在上了EWM系统后,运行一段时间可能因为不正确的操作,系统意外情况数据不一致的问题,交货单行项目状态不致,等等报不一致的情况,EWM的自检功能比较强. 下面介绍一种数据不致的修复工具之一,tx: /S ...