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 中各种锁如何使用,一方面笔者没有大 ...
随机推荐
- [MSSQL] Useful SQL Scripts - CalendarBase
Useful SQL scripts DECLARE @StartDate DATETIME DECLARE @EndDate DATETIME DECLARE @FiscalBeginMonth I ...
- 倔强的网站数据抓取,关键时刻还需Webbrowser显身手
由于最近台风挺多,公司网站上需要挂上台风预报信息,就整了个抓取台风数据(至于抓数据的概念和实践手册我以前写的一篇博客里面有介绍:分享一套抓数据小程序,客户资料.实时新闻.股票数据…随心抓)的服务,做调 ...
- 【译】用Fragment创建动态的界面布局(附Android示例代码)
原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...
- Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结
Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...
- 搭建wamp环境,数据库基础知识
服务器管理软件php Apache.net IISjava Tomcat 服务器管理软件起到的作用:管理服务器工作,具体的工作如下:1.静态页面用户将请求发送到服务器,服务器中的服务器管理软件将请求发 ...
- MultiTouch————多点触控,伸缩图片,变换图片位置
前言:当今的手机都支持多点触控功能(可以进行图片伸缩,变换位置),但是我们程序员要怎样结合硬件去实现这个功能呢? 跟随我一起,来学习这个功能 国际惯例:先上DEMO免费下载地址:http://down ...
- Leetcode 200 Number of Islands DFS
统计联通区域块的个数,简单dfs,请可以参考DFS框架:Leetcode 130 Surrounded Regions DFS class Solution { public: int m, n; b ...
- inotify-tools使用方法介绍
原文 inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件. inotify-tool ...
- BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题
BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 原文:http://www.sufeinet.com/thread-3707-1-1.html 大家可以先看看我上 ...
- redolog文件头简单探究
先切换: SQL> select group#,status from v$log; GROUP# STATUS---------- ---------------- 1 INA ...