在多线程操作中,有一个著名的错误,叫做“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];
分享到:
相关推荐
可以使用`dispatch_async`或者`performSelectorOnMainThread`来确保在主线程上操作。 通过以上步骤,我们可以利用`OC-NSOperation`构建一个高效的异步图片下载机制,同时保持良好的用户体验和系统资源管理。这个...
它不仅可以封装任意的任务逻辑,还可以与其他`NSOperation`对象之间建立依赖关系,从而实现复杂的并发任务调度。 - **NSOperation**:每个`NSOperation`对象代表一个具体的任务,内部封装了任务的执行逻辑。可以...
线程间通信主要包括:使用NSOperation的completionHandler、GCD的group和semaphore、performSelectorOnMainThread等方式。这些方法可以帮助线程间传递结果、同步状态或者在特定线程上执行代码。 八、线程池 线程池...
总的来说,iOS开发中的多线程技术涉及NSThread、POSIX Thread、NSOperation与NSOperationQueue以及GCD等,它们各有优势和使用场景。而RunLoop是管理线程生命周期的关键组件,对于理解iOS应用性能优化至关重要。掌握...
Objective-C提供了`performSelectorOnMainThread:`方法,允许你在新线程中安全地调用主线程的方法。这样可以确保UI操作在主线程上执行,避免出现线程安全问题。 线程池的概念在Objective-C中通过`NSOperation`和`...
可以使用`dispatch_async`配合主线程队列或者`performSelectorOnMainThread`来实现。 四、多线程中的数据同步 当多个线程访问同一份资源时,可能会出现竞态条件,导致数据不一致。iOS提供了锁(NSLock、@...
[self performSelectorOnMainThread:@selector(doSomething:) withObject:@"hi" waitUntilDone:YES]; ``` 此方法确保`doSomething:`方法在主线程上执行,`waitUntilDone:YES`表示等待该方法执行完毕。 3. **指定...
《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Objective-C在iOS和OS X平台上的核心特性的书籍。本书重点聚焦于多线程和内存管理两个关键领域,对于iOS和macOS应用开发人员来说,这是理解和优化...
此外,源码可能还涵盖了如何在主线程和后台线程之间切换,以更新UI(如使用`DispatchQueue.main.async`或`performSelectorOnMainThread`),因为所有的UI操作都必须在主线程上进行。 总之,"多线程_IOS应用源码.zip...
因此,当在后台线程执行耗时操作时,应使用`dispatch_async`或`performSelectorOnMainThread`确保结果在主线程上更新UI。 4. **线程安全** 在多线程环境中,多个线程可能会同时访问同一数据,导致数据不一致。为...
3. **NSOperation/NSOperationQueue**:NSOperation是对线程的高级封装,提供了更好的可取消、依赖、暂停和恢复等特性。NSInvocationOperation和NSBlockOperation分别用于封装方法调用和代码块。NSOperationQueue...
与其他多线程技术如GCD(Grand Central Dispatch)和NSOperation相比,NSThread更直接,但同时也需要开发者手动管理线程的生命周期。 ### NSThread的使用方法 #### 隐藏创建线程 隐藏创建线程通常通过调用`...
在“iOS多线程Demo”中,可能会包含如何在后台线程完成耗时操作后,在主线程更新UI的方法,如使用`dispatch_async`向主线程发送任务,或者使用`performSelectorOnMainThread`。 此外,多线程还会涉及线程安全问题,...
[self performSelectorOnMainThread:@selector(methodToRun) withObject:nil waitUntilDone:NO]; ``` **延时执行代码**: ```objective-c dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)...
知识点:Object-C中创建线程的方法有三种:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation。主线程中执行代码的方法是performSelectorOnMainThread。如果想延时执行代码可以用performSelector:on...
例如,可以使用`DispatchQueue.main.async`、`-[NSThread performSelectorOnMainThread:]`或`-[NSOperationQueue addOperationWithBlock:]`。 综上所述,GCD、NSThread和NSOperationQueue各有优缺点,选择哪种取决...
- **在主线程执行代码**:可以使用`performSelectorOnMainThread:`方法来确保某个方法在主线程中执行。这种方法特别适用于更新用户界面的任务,因为用户界面元素通常只能在主线程中进行修改。 - **延时执行代码**:...
UI更新应该在主线程上进行,使用`performSelectorOnMainThread:`或GCD的`dispatch_async(dispatch_get_main_queue(), ^{...})`方法。 ##### 1.5.5 了解线程退出时的行为 理解线程的生命周期以及如何优雅地退出线程...
iOS中的多线程技术是应用程序开发中的重要组成部分,它允许开发者在不同的线程上同时执行任务,...在实际开发中,开发者应根据具体需求选择合适的多线程技术,如NSThread、NSOperation或GCD,以实现最佳的并发策略。