`
isiqi
  • 浏览: 16550721 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

iPhone开发技巧之网络篇(3)--- 使用NSOperation建立多任务网络连接

阅读更多

在网络应用程序中,经常需要多任务连接来提高程序的性能。比如多任务下载,多任务HTTP请求等,即线程控制模型中的工作群模型。使用 NSOperation 可以很容易实现这个功能。下面就以使用NSOperation处理并行的HTTP请求为例子,说明其用法。

首先准备一个 NSOperation 的子类,用于处理 HTTP 请求。

1
2
3
4
5
6
7
8
@interface RequestOperation : NSOperation {
  NSURLRequest*  _request;
  NSMutableData* _data;
}

- (id)initWithRequest:(NSURLRequest *)request;

@end

下面是实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@implementation RequestOperation

- (id)initWithRequest:(NSURLRequest *)request {
  if (self = [self init]) {
    _request = [request retain];
    _data = [[NSMutableData data] retain];
  }
  return self;
}

- (void)dealloc {
  [_request release];
  [_data release];
  [super dealloc];
}

// 如果不载下面的函数,会出错
- (BOOL)isConcurrent {
  return YES;
}

// 开始处理
- (void)start {
  if (![self isCancelled]) {
    // 以异步方式处理事件
    [NSURLConnection connectionWithRequest:_request delegate:self];
  }
}

// 取得数据
- (void)connection:(NSURLConnection*)connection
    didReceiveData:(NSData*)data {
  // 添加数据
  [_data appendData:data];
}

// HTTP请求结束
- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
}

@end

如果没有重载 isConcurrent 函数,缺省是返回NO,就是说只能以同步的方式处理。而如果又使用了connectionWithRequest:delegate: 以异步方式处理事件后,会产生下面的错误信息:

1
_NSAutoreleaseNoPool(): Object 0x18a140 of class NSURLConnection autoreleased with no pool in place - just leaking

然后在你的 Controller 类中用 NSOperationQueue 来处理各个任务。

1
2
3
4
5
@interface xxViewController : UIViewController {
  NSOperationQueue* _queue;
}

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@implementation xxViewController

- (IBAction)buttonClicked:(id) sender {
  _queue = [[NSOperationQueue alloc] init];
  // 第一个请求
  NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
  RequestOperation* operation = [[RequestOperation alloc] initWithRequest:request];
  [operation autorelease];
  // 第二个请求
  NSURLRequest* request2 = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.yahoo.co.jp"]];
  RequestOperation* operation2 = [[RequestOperation alloc] initWithRequest:request2];
  [operation2 autorelease];
  // 开始处理
  [_queue addOperation:operation];
}

@end

以上,用 NSOperation 来并行处理不同的任务,使用 NSOperationQueue 来控制复数的 NSOperation,并且可以限制Queue的大小,而不是无限制的使用任务。当一个任务完成,就执行待机中的任务。

分享到:
评论

相关推荐

    iOS开发 - 第04篇 - 网络 - 01 - NSOperation & 网络基础

    这篇教程主要关注的是NSOperation在网络编程中的应用以及基础的网络概念。NSOperation是Apple提供的一种高级任务调度机制,它为并发编程提供了强大而灵活的支持,尤其适合处理网络请求。下面我们将深入探讨这两个...

    iOS多线程应用开发中使用NSOperation类的基本方法

    本篇将详细介绍如何在iOS应用开发中使用NSOperation类进行多线程编程。 一、NSOperation简介 NSOperation是一个抽象类,其主要作用是为多线程编程提供了一种更加灵活的解决方案。与直接使用GCD(Grand Central ...

    iOS 多线程NSoperation

    本篇文章将深入探讨iOS多线程中的NSOperation及其相关知识点。 一、NSOperation简介 NSOperation是Objective-C中的一个抽象类,它是操作对象的基类。与直接使用GCD相比,NSOperation提供了更丰富的特性,如依赖管理...

    iOS多线程与网络开发之NSOperation示例代码

    配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQueue中 ...

    iOS-多线程之NSOperation - iOS知识库1

    本篇文章主要探讨了iOS中的NSOperation及其队列,它是Apple提供的一个强大的多线程解决方案。 首先,多线程是指在一个应用程序中同时运行多个线程或任务,这使得程序可以在等待某个操作完成的同时执行其他任务。iOS...

    NSOperation-Network-Demo:关于如何使用 NSOperation 子类进行异步网络调用的小演示

    NSOperation 是苹果在 iOS 和 macOS 开发中提供的一种高级任务调度和并发控制机制,它源自于 GCD(Grand Central Dispatch)但提供了更多的灵活性和可控性。在这个“NSOperation-Network-Demo”项目中,我们将深入...

    NSOperation

    NSOperation是苹果iOS和macOS开发中的一个关键概念,它属于Foundation框架,是Apple为解决多线程和并发问题提供的一种高级抽象。在iOS和macOS应用开发中,特别是处理像UITableView这样的视图组件时,高效地加载和...

    Objective-C并发编程:NSOperation与NSOperationQueue的精妙协同

    ### Objective-C并发编程:深入解析NSOperation与NSOperationQueue #### 一、Objective-C简介及其特点 ...掌握 `NSOperation` 和 `NSOperationQueue` 的使用技巧,对于任何 Objective-C 开发者来说都是非常有价值的。

    NSOperation例子

    NSOperation是苹果iOS和macOS开发中的一个关键概念,它属于Foundation框架,是Apple为解决多线程...NSOperation和NSOperationQueue的使用是iOS和macOS开发中的最佳实践之一,它们使得多线程编程变得更加简单和可控。

    OC-NSOperation异步线程下载图片

    在iOS开发中,异步加载图片是一项常见的任务,特别是在处理大量数据或者网络请求时,为了提升用户体验,我们通常会将这种耗时的操作放在后台线程进行。...理解并掌握`NSOperation`的使用,是iOS开发中的重要技能之一。

    ios (线程 iphone 并发 异步 NSOperation)介绍

    - 使用`NSOperation`或`DispatchQueue`来并发执行循环中的任务。 **5.4 替换线程Join** - **问题**:线程Join会导致主线程阻塞。 - **解决方案**:使用`dispatch_group_wait`来等待一组任务完成。 **5.5 修改...

    Objective-C的NSOperation多线程类基本使用指南剖析.pdf

    NSOperation是Objective-C中用于实现多线程编程的一个高级接口,它是苹果的Foundation框架的一部分,提供了比直接使用NSThread更灵活的并发控制机制。NSOperation不仅封装了具体的操作任务,还支持操作的依赖关系、...

    同步和异步的NSOperation的Demo

    NSOperation和NSOperationQueue是iOS和Mac OS X开发中用于实现多任务并行处理的关键框架,它们是苹果提供的高级并发工具,旨在简化复杂的线程管理和任务调度。在本Demo中,我们将深入探讨同步和异步操作的区别以及...

    iphone开发指南-精彩章节

    《iPhone开发指南》是iOS应用开发者的入门宝典,它涵盖了从基础到进阶的各种知识点。这份资料包含的精彩章节包括第八...通过阅读这些精选章节,你将能够逐步揭开iPhone应用程序开发的神秘面纱,踏上精彩的iOS开发之旅。

    iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    使用多线程可以显著提高程序的响应速度和效率,尤其是在处理耗时任务时,避免了UI卡顿的情况发生。例如,网络请求、数据库查询等耗时操作可以通过多线程在后台进行,从而保持UI线程的流畅性。 #### 二、多线程实现...

    NSOperationDemo

    NSInvocationOperationViewController: NSOperation 的子类 NSInvocationOperation 线程的基本使用 NSBlockOperationViewController: NSOperation 的子类 NSBlockOperation 线程的基本使用 ...

    演示多线程加载图片NSThread NsOperation GCD

    在iOS开发中,多线程技术是不可或缺的一部分,特别是在处理耗时操作如加载图片时,为了保持用户界面的流畅,我们需要将这些任务放在后台线程执行。本教程将重点讲解三种多线程技术:NSThread、NSOperation和GCD...

    轻松学iPhone开发课件

    10. **多线程编程**:理解GCD(Grand Central Dispatch)、NSOperation和NSOperationQueue,以实现异步任务和后台处理。 11. **推送通知**:学习如何集成Apple Push Notification Service (APNs),向用户发送实时...

Global site tag (gtag.js) - Google Analytics