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 中各种锁如何使用,一方面笔者没有大 ...
随机推荐
- Linux下通过NFS共享文件夹
测试环境:CentOS 6.7 服务端 # yum -y install nfs-utils rpcbind # 开启服务 service nfs start service rpcbind star ...
- jenkins2 Jenkinsfile
推荐使用Jenkinsfile代替将groovy脚本直接写在jenkins job里. 文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://g ...
- [BTS] BizTalk host BizTalkServerApplication throttled because DatabaseSize exceeded the configured throttling limit.
Log Name: ApplicationSource: BizTalk ServerDate: 7/22/2013 6:10:38 PMEvent ID: 7001Task Category: Bi ...
- Bean的作用域及生命周期
指定bean的作用域通过scope属性 singleton单实例模式,从初始化容器就初始化bean,除非延迟初始化lazy-init=true prototype每次从容器获取bean是新的对象,从g ...
- Atitit.guice3 ioc 最佳实践 o9o
Atitit.guice3 ioc 最佳实践 o9o 1. Guice的优点and跟个spring的比较 1 2. 两个部分:::绑定and注入@Inject 1 3. 绑定所有的方法总结 2 3. ...
- no sigar-amd64-winnt.dll in java.library.path 错误
需要维护别人写的一个WEB项目,还原数据库,从SVN中检出源码,运行,提示如下错误: 5526 [localhost-startStop-1] DEBUG Sigar - no sigar-amd6 ...
- 使用Gulp和Browserify来搭建React应用程序
对React有一定了解之后,我们知道,需要把JSX文件转换成JS文件,组件需要导入导出.本篇就体验使用Gulp把JSX文件转换成JS文件,使用Browserify来把组件捆绑到一个文件并理顺组件之间的 ...
- PlaceholderImageView
PlaceholderImageView 说明 1. PlaceHolderImageView基于SDWebImage编写 2. 给定一个图片的urlString,以及一个placeholderIma ...
- #pragma data_seg 共享数据区(转)
原文地址:http://www.cnblogs.com/CBDoctor/archive/2013/01/26/2878201.html 1)#pragma data_seg()一般用于DLL中.也就 ...
- 2014 Hangjs 见闻流水账第一天
前言 6月21日~6月22日, 第一次跑远门去参加一个大会(广州 -> 杭州),本来打算,在火车的回来的路上,把这两天的东西记录一下,不过,火车上的环境实在恶劣,同时也高估了自己的专注力,所以, ...