`
dazuiba
  • 浏览: 130911 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

iphone多线程操作NSArray时的一个技巧

阅读更多
技巧说明:一个以上的线程同时操作NSArray, 任何一个有写操作,都容易引起“Collection was mutated while being enumerated” ”

所以在其中只有读操作的线程中,将此Array拷贝一份出来进行读取,可以解决此问题。


使用场景:移动地图时,地图上会及时出现当前窗口经纬度范围的物体(比如一些自己geo数据库中的优惠餐馆等)

程序结构:1. 在移动地图事件上触发网络请求。
                    2. 请求返回后,将返回的数据用MKAnnotion的方式显示在地图上

用户体验要求:在请求返回前,用户可以继续移动地图。这意味这1和2是异步的,需要在不同的线程中进行

主要代码:

线程1中,发出网络请求
- (void)mapView:(MKMapView *)map regionDidChangeAnimated:(BOOL)animated
{
	self.searchResult.location = [mapView region];
	[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
	[self.searchResult loadData];
}


线程2中渲染mapView
- (void)update {
	NSArray *sitesResult = [NSArray arrayWithArray:self.searchResult.results];
	if (sitesResult && [sitesResult count]>0) {
		[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
		for (GHSite *site in sitesResult) {
			BOOL found = NO;
			for (MKAnnotation *ann in [mapView annotations]) {
				if ([[ann title] isEqualToString:site.title]) {
					found =YES;
				}
			}
			if(!found)		 
				[mapView addAnnotation:site];
		}
		[sitesResult release];
		[super viewDidLoad];
	}
}



注意,如果没有下面这句话,会发生异常:
"Collection was mutated while being enumerated”

	NSArray *sitesResult = [NSArray arrayWithArray:self.searchResult.results];
分享到:
评论

相关推荐

    斯坦福大学 iphone 教程 图文讲解 全

    7. **多线程**:讲解GCD(Grand Central Dispatch)和NSOperationQueue,如何在iOS应用中实现后台任务和并发编程。 8. **Core Data**:苹果提供的持久化框架,用于存储和检索应用程序的数据。课程将指导如何设计...

    objc iphone开发基础pdf

    除此之外,学习iPhone开发还需要理解内存管理和ARC(Automatic Reference Counting)机制,以及多线程编程,包括GCD(Grand Central Dispatch)和NSOperationQueue。网络编程也是必不可少的一部分,Objective-C提供...

    iphone存储用法汇总

    这在多线程环境中非常有用,因为它避免了同步问题。 - **创建字符串的方法**: - 直接初始化:`NSString *astring = @"This is a String!";` - 使用`alloc`和`init`方法:`NSString *astring = [[NSString alloc]...

    iPhone4开发入门 Beginning iPhone 4 +源代码.zip

    同时,还会涉及手势识别、动画效果、多线程处理以及网络请求等进阶话题。 在iOS开发中,事件处理是关键的一环。本书会讲解事件驱动模型,包括触摸事件、键盘事件以及通知机制。读者会了解到如何响应用户的操作,并...

    iPhone开发常用类型的参考

    文件可能涵盖了数组的动态操作,如插入、移除、替换、排序等,以及如何安全地在多线程环境中操作NSMutableArray。 7. **NSScanner_Class.pdf**:NSScanner用于扫描字符串,从一个字符串中提取特定的数据。文件可能...

    Object-c for iphone

    GCD 是苹果提供的多线程解决方案,简化了异步编程,通过队列管理和任务调度实现高效并发。 4. Key-Value Coding (KVC) & Key-Value Observing (KVO) KVC 和 KVO 分别用于间接访问对象属性和监听属性变化,是绑定...

    iPhone 开发,面向对象的C语言

    Grand Central Dispatch(GCD)是Apple的多线程解决方案,它简化了并发编程。Block是Objective-C中的一种匿名函数,常与GCD结合使用,处理异步任务。 六、Core Data Core Data是Apple提供的数据持久化框架,用于...

    iphone开发之NSFileManager_Class[定义].pdf

    4. 文件同步:在多线程环境中,使用锁或GCD来同步对文件的操作,防止数据冲突。 总之,NSFileManager是iOS和macOS开发中不可或缺的一个工具,掌握其用法对于构建高效、稳定的应用至关重要。理解并熟练运用...

    iPhone Application Programming L02: Interface Builder

    Objective-C中的多任务和并发机制提供了强大的功能,可以用来处理后台任务、定时器和多线程等。例如,`NSTimer`类可用于创建周期性执行的任务;`NSOperationQueue`则可用于管理多个并发操作。 **7. Filesystem and ...

    IPhone(objective-c)开发

    当我们写 `[anObject doSomething:]` 时,实际上是向`anObject`发送一个名为`doSomething:`的消息。这种机制允许动态绑定,使得代码更具灵活性。 3. **内存管理**:Objective-C使用自动引用计数(ARC)进行内存管理...

    iPhone常见面试题

    `atomic`和`nonatomic`控制属性的访问是否是原子操作,对于多线程环境至关重要。 #### 8. ViewController生命周期方法的作用 `viewDidLoad`, `viewWillAppear`, `viewDidUnload`, `dealloc`等方法在不同的生命周期...

    Foundation Framework Reference&iphone Foundation框架参考

    描述中提到,这是一个本地化的资源,开发者可以在没有网络的情况下查阅苹果手机开发中遇到的不理解的方法和类。这表明该文档可能包含了详细的方法和类的解释,对于初学者和经验丰富的开发者来说都是一个宝贵的工具。...

    iphone面试题

    ### iPhone程序员面试题详解 #### 1. 实现`NSString`类的方法 题目要求实现`NSString...- `nonatomic`:非原子性,提高多线程环境下的性能,但可能不是线程安全的。 这些修饰符决定了属性的访问方式和内存管理策略。

    iphone开发比较实用,object-c注意事项,能提高不少

    9. **Foundation框架**:这是iOS开发的基础,包含了诸如NSArray、NSDictionary、NSString等常用数据结构,以及NSThread、NSOperationQueue等多线程支持。 10. **Delegation**:委托设计模式是Objective-C中的重要...

    iphone(Objective-C)

    最后,Objective-C与Swift的互操作性也是现代iOS开发的一个重要话题。虽然Swift已经成为首选语言,但Objective-C的许多项目和库仍在广泛使用,掌握两者之间的桥接技术能帮助开发者充分利用现有资源。 通过阅读...

    object-c初学者中文教程 附源码 iPhone开发必读

    3. **GCD(Grand Central Dispatch)**:Apple提供的多线程解决方案,利用Blocks简化并发编程。 4. **Foundation框架**:Objective-C的基础框架,提供了许多核心数据类型和常用功能,如字符串处理、集合类(NSArray...

    ios object-c 面试试题 及答案

    setter通常不会直接设置,因为NSArray是不可变的,但可以创建一个新的NSArray实例来替换旧的。例如: ```objc - (void)setArrayProperty:(NSArray *)newArray { _arrayProperty = [newArray copy]; } ``` 4. *...

    【Objective-C Recipes】[PDF+源代码] [iPhone/iPad/iOS]

    7. **多线程**:iOS开发中,为了提高用户体验,往往需要在后台线程执行耗时操作。GCD(Grand Central Dispatch)和NSOperationQueue是Objective-C中处理多线程的重要工具。 8. **网络编程**:Objective-C Recipes...

Global site tag (gtag.js) - Google Analytics