performSelectorOnMainThread

[selfperformSelectorOnMainThread:@selector(fetchedData:) withObject:datawaitUntilDone:YES];

会创建一个新的线程实行fetchedData函数,并传入参数data,并且会等待函数退出后再继续执行。

- (void)fetchedData:(NSData *)responseData
{

......

}

在多线程操作中,有一个著名的错误,叫做“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];

performSelectorOnMainThread,布布扣,bubuko.com

时间: 2024-11-03 01:31:19

performSelectorOnMainThread的相关文章

iOS: 学习笔记, 使用performSelectorOnMainThread及时刷新UIImageView

在iOS中, 界面刷新在主线程中进行, 这导致NSURLSession远程下载图片使用UIImageView直接设置Image并不能及时刷新界面. 下面的代码演示了如何使用 performSelectorOnMainThread: withObject:  waitUntilDone: 方法来及时刷新图片 1. 创建iOS空应用程序(Empty Application). 2. 加入一个控制器类. 在YYAppDelegate.m中修改 #import "MainViewController.h

ios更新UI时请尝试使用performSelectorOnMainThread方法

最近开发项目时发现联网获取到数据后,使用通知方式让列表刷新会存在死机的问题. 经过上网查找很多文章,都建议使用异步更新的方式,可是依然崩溃. 最后尝试使用performSelectorOnMainThread方法可以成功更新tableView. 下面就学习一下这个函数吧! NSObject类的performSelectorOnMainThread和performSelectorInBackground可以实现简单的多线程编程技术 1.- (void)performSelectorInBackgr

利用performSelectorInBackground和performSelectorOnMainThread实现多线程

NSObject类的performSelectorOnMainThread和performSelectorInBackground能够实现简单的多线程编程技术 1.- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg 创建一个线程在子线程运行,aSelector代表了新创建的线程.arg是传入的參数 2.- (void)performSelectorOnMainThread:(SEL)aSelector wit

iOS: 学习笔记, performSelectorOnMainThread

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait performSelectorOnMainThread:withObject:waitUntilDone: 基于默认模式调用主线程中接收器的方法 Invokes a method of the receiver on the main thread using the default mode. 参数 Par

iOS使用AVFoundation实现二维码扫描

实现过程如下: Step1:需要导入:AVFoundation Framework 包含头文件: #import <AVFoundation/AVFoundation.h> Step2:设置捕获会话 设置 AVCaptureSession 和 AVCaptureVideoPreviewLayer 成员 1 2 3 4 5 6 7 8 9 10 #import <AVFoundation/AVFoundation.h> static const char *kScanQRCodeQu

【面试】iOS 开发面试题(一)

  1. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import""又什么区别? 答:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包

多线程之-NSOperation

多线程之-NSOperation NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类 NSInvocationOperation 如果直接执行NSInvocationOperation中的操作, 那么默认会在主线程中执行 // 创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 创建操作 NSInvocationOperation *operation = [[NSInvocationOpe

iOS清除缓存

[objc] view plaincopy #pragma mark === 暂时不用清除缓存===== -(void)myClearCacheAction{ dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) , ^{ NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDoma

iOS开发——多线程OC篇&amp;GCD实用总结

GCD实用总结 图片下载 注:iOS开发中常见GCD的实用也就这些了, 先来看看之前我们经常使用的方式: 1 static NSOperationQueue * queue; 2 3 - (IBAction)someClick:(id)sender { 4 self.indicator.hidden = NO; 5 [self.indicator startAnimating]; 6 queue = [[NSOperationQueue alloc] init]; 7 NSInvocationO