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

NSOperation与performSelectorOnMainThread

阅读更多

在多线程操作中,有一个著名的错误,叫做“Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread”,一旦出现这个错误,程序会立即crashed。

这是由于,apple不允许程序员在主线程以外的线程中对ui进行操作(Bug?)

而笔者在一次http异步操作中也出现过这个错误。当时使用了NSOperation进行了http异步请求,然后使用kvo模式注册观察者,当数据下载完毕后,在主线程中接收下载完毕的通知,并在observeValueForKeyPath方法中使用[tableview reloadData]更新UI。

这样也导致了上述错误。

解决的方法是使用performSelectorOnMainThread进行ui的更新:

[self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO];

分享到:
评论

相关推荐

    OC-NSOperation异步线程下载图片

    可以使用`dispatch_async`或者`performSelectorOnMainThread`来确保在主线程上操作。 通过以上步骤,我们可以利用`OC-NSOperation`构建一个高效的异步图片下载机制,同时保持良好的用户体验和系统资源管理。这个...

    IOS编程中使用多线程

    它不仅可以封装任意的任务逻辑,还可以与其他`NSOperation`对象之间建立依赖关系,从而实现复杂的并发任务调度。 - **NSOperation**:每个`NSOperation`对象代表一个具体的任务,内部封装了任务的执行逻辑。可以...

    iOS 线程资料汇总

    线程间通信主要包括:使用NSOperation的completionHandler、GCD的group和semaphore、performSelectorOnMainThread等方式。这些方法可以帮助线程间传递结果、同步状态或者在特定线程上执行代码。 八、线程池 线程池...

    iOS开发学习之iOS多线程和RunLoop.pdf

    总的来说,iOS开发中的多线程技术涉及NSThread、POSIX Thread、NSOperation与NSOperationQueue以及GCD等,它们各有优势和使用场景。而RunLoop是管理线程生命周期的关键组件,对于理解iOS应用性能优化至关重要。掌握...

    Object-C的语法与Cocoa框架V1.0.pdf

    Objective-C提供了`performSelectorOnMainThread:`方法,允许你在新线程中安全地调用主线程的方法。这样可以确保UI操作在主线程上执行,避免出现线程安全问题。 线程池的概念在Objective-C中通过`NSOperation`和`...

    多线程操作(较全)

    可以使用`dispatch_async`配合主线程队列或者`performSelectorOnMainThread`来实现。 四、多线程中的数据同步 当多个线程访问同一份资源时,可能会出现竞态条件,导致数据不一致。iOS提供了锁(NSLock、@...

    iOS多线程简单介绍

    [self performSelectorOnMainThread:@selector(doSomething:) withObject:@"hi" waitUntilDone:YES]; ``` 此方法确保`doSomething:`方法在主线程上执行,`waitUntilDone:YES`表示等待该方法执行完毕。 3. **指定...

    Objective-C高级编程 iOS与OS X多线程和内存管理

    《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Objective-C在iOS和OS X平台上的核心特性的书籍。本书重点聚焦于多线程和内存管理两个关键领域,对于iOS和macOS应用开发人员来说,这是理解和优化...

    多线程_IOS应用源码.zip

    此外,源码可能还涵盖了如何在主线程和后台线程之间切换,以更新UI(如使用`DispatchQueue.main.async`或`performSelectorOnMainThread`),因为所有的UI操作都必须在主线程上进行。 总之,"多线程_IOS应用源码.zip...

    iOS多线程编程指南(一)关于多线程编程 - 51CTO.COM1

    因此,当在后台线程执行耗时操作时,应使用`dispatch_async`或`performSelectorOnMainThread`确保结果在主线程上更新UI。 4. **线程安全** 在多线程环境中,多个线程可能会同时访问同一数据,导致数据不一致。为...

    多线程技术在iOS开发中的使用.doc

    3. **NSOperation/NSOperationQueue**:NSOperation是对线程的高级封装,提供了更好的可取消、依赖、暂停和恢复等特性。NSInvocationOperation和NSBlockOperation分别用于封装方法调用和代码块。NSOperationQueue...

    IOS多线程编程NSThread的使用方法

    与其他多线程技术如GCD(Grand Central Dispatch)和NSOperation相比,NSThread更直接,但同时也需要开发者手动管理线程的生命周期。 ### NSThread的使用方法 #### 隐藏创建线程 隐藏创建线程通常通过调用`...

    iOS多线程Demo

    在“iOS多线程Demo”中,可能会包含如何在后台线程完成耗时操作后,在主线程更新UI的方法,如使用`dispatch_async`向主线程发送任务,或者使用`performSelectorOnMainThread`。 此外,多线程还会涉及线程安全问题,...

    iOS笔试题

    [self performSelectorOnMainThread:@selector(methodToRun) withObject:nil waitUntilDone:NO]; ``` **延时执行代码**: ```objective-c dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)...

    iOS开发高级程序员面试题-答案.pdf,这是一份不错的文件

    知识点:Object-C中创建线程的方法有三种:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation。主线程中执行代码的方法是performSelectorOnMainThread。如果想延时执行代码可以用performSelector:on...

    多线程GCD,NSThread,NSOperationQueue,详细解释Demo

    例如,可以使用`DispatchQueue.main.async`、`-[NSThread performSelectorOnMainThread:]`或`-[NSOperationQueue addOperationWithBlock:]`。 综上所述,GCD、NSThread和NSOperationQueue各有优缺点,选择哪种取决...

    IOS 职位面试问题及答案

    - **在主线程执行代码**:可以使用`performSelectorOnMainThread:`方法来确保某个方法在主线程中执行。这种方法特别适用于更新用户界面的任务,因为用户界面元素通常只能在主线程中进行修改。 - **延时执行代码**:...

    ios多线程指南

    UI更新应该在主线程上进行,使用`performSelectorOnMainThread:`或GCD的`dispatch_async(dispatch_get_main_queue(), ^{...})`方法。 ##### 1.5.5 了解线程退出时的行为 理解线程的生命周期以及如何优雅地退出线程...

    iOS多线程开发——NSThread浅析

    iOS中的多线程技术是应用程序开发中的重要组成部分,它允许开发者在不同的线程上同时执行任务,...在实际开发中,开发者应根据具体需求选择合适的多线程技术,如NSThread、NSOperation或GCD,以实现最佳的并发策略。

Global site tag (gtag.js) - Google Analytics