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 中各种锁如何使用,一方面笔者没有大 ...
随机推荐
- [ACM_水题] UVA 11729 Commando War [不可同时交代任务 可同时执行 最短完成全部时间 贪心]
There is a war and it doesn't look very promising for your country. Now it's time to act. You have a ...
- JSPatch中的OC高级语法
1)多线程相关 dispatch_after dispatch_async dispatch_sync dispatch_get_main_queue dispatch_get_global_queu ...
- 标签简化Spring-MVC配置
新填入@RequestMapping标签 和@org.springframework.stereotype.Controller标签 这样做就是通过标签来简化之前,对HandlerMapping的配置 ...
- ios 项目里常用的宏
NSLog(@"__func__ : %s", __func__);//oc测试环境,打印文件名,方法名 NSLog(@"__FUNCTION__ : %s" ...
- javascript 日常总结
1. 将彻底屏蔽鼠标右键 oncontextmenu=”window.event.returnValue=false” < table border oncontextmenu=return(f ...
- Linux下的NFS配置(转)
http://rubyer.me/blog/1682/ 遇到的问题: 1.reason given by server: Permission denied 在服务器的/etc/export配置文件中 ...
- Atitit.计算机图形图像图片处理原理与概论attilax总结
Atitit.计算机图形图像图片处理原理与概论attilax总结 计算机图形1 图像处理.分析与机器视觉(第3版)1 数字图像处理(第六版)2 图像处理基础(第2版)2 发展沿革 1963年,伊凡·苏 ...
- atitit.提升2--3倍开发效率--cbb体系的建设..
atitit.提升开发效率--cbb体系的建设.. #--提升倍数,大概2--3倍.. #---cbb的内容 知识的,expt的,经验的技术的部件的问题库的角度.. #---cbb的层次,tech l ...
- atitit. js 跨界面 页面 web cs 传值方法总结
atitit. js 跨界面 页面 web cs 传值方法总结 #--需求 js #---两个方法: 直接传跟跟间接传递... 1.直接传跟new form(param) web使用url方 ...
- Leetcode 102 Binary Tree Level Order Traversal 二叉树+BFS
二叉树的层次遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ...