- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,提前感谢您抽出时间查看此问题。
我正在尝试创建一个非常简单的 UIViewController 示例,我在线程中加载数据。该线程正在被调用,但从该线程中,我无法返回主线程。下面的测试用例非常简单,我在 XCode 中创建一个基于 View 的应用程序,然后添加了 NSOperationQueue 代码。希望有人能很快发现我的学生错误:)
委托(delegate)很简单,.h是:
#import<UIKit/UIKit.h>
@class ViewbasedViewController;
@interface ViewbasedAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
ViewbasedViewController *viewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ViewbasedViewController *viewController;
@end
.m 同样简单:
#import "ViewbasedAppDelegate.h"
#import "ViewbasedViewController.h"
@implementation ViewbasedAppDelegate
@synthesize window;
@synthesize viewController;
#pragma mark -
#pragma mark Application lifecycle
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Set the view controller as the window's root view controller and display.
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
现在回答问题。我想在加载 View 时运行一个线程。我在 viewcontroller.h 文件中定义了一个 NSOperationQueue:
@interface ViewbasedViewController : UIViewController {
NSOperationQueue *folderQueue;
}
在我的 View controller.m中,我想在加载 View 后在线程中运行一些代码。因此,在 viewDidLoad 内部,我向队列添加了一个操作:
- (void)viewDidLoad {
[super viewDidLoad];
// create a thread and run it
folderQueue = [[NSOperationQueue alloc] init];
folderQueue.maxConcurrentOperationCount = 1;
NSLog(@"about to run thread");
[folderQueue addOperation:[[[NSInvocationOperation alloc]
initWithTarget:self selector:@selector(MyThreadedCode)
object:nil] autorelease]];
}
函数“MyThreadedCode”被正常调用,我可以在控制台中看到调试。
-(void)MyThreadedCode
{
NSLog(@"Start of thread");
[self performSelectorOnMainThread:@selector(reloadMyData) withObject:nil WaitUntilDone:YES];
// [self reloadMyData];
NSLog(@"CALLED REFRESH");
}
-(void)reloadMyData
{
NSLog(@"Request to reloadData");
}
但是...如果从我的线程中尝试在主线程上调用选择器(例如我可能想在 TableView 中重新加载数据),我会得到一个异常。只有当我使用 PerformanceSelectorOnMainThread 运行它时,我才会得到这个。如果我运行
[self reloadMyData];
控制台看起来不错:
[Session started at 2011-09-06 13:56:50 +0100.]
2011-09-06 13:56:52.258 Viewbased[1618:207] about to run thread
2011-09-06 13:56:52.266 Viewbased[1618:5d03] Start of thread
2011-09-06 13:56:52.270 Viewbased[1618:5d03] Request to reloadData
2011-09-06 13:56:52.272 Viewbased[1618:5d03] CALLED REFRESH
如果我使用
[self performSelectorOnMainThread:@selector(reloadMyData) withObject:nil WaitUntilDone:YES];
我得到一个无法识别的选择器:
[Session started at 2011-09-06 13:29:14 +0100.]
2011-09-06 13:29:26.216 Viewbased[1581:207] about to run thread
2011-09-06 13:29:26.224 Viewbased[1581:5d03] Start of thread
2011-09-06 13:29:26.228 Viewbased[1581:5d03] -[ViewbasedViewController performSelectorOnMainThread:withObject:WaitUntilDone:]: unrecognized selector sent to instance 0x4e43060
2011-09-06 13:29:26.235 Viewbased[1581:5d03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewbasedViewController performSelectorOnMainThread:withObject:WaitUntilDone:]: unrecognized selector sent to instance 0x4e43060'
*** Call stack at first throw:
(
0 CoreFoundation 0x00eab5a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x00cda313 objc_exception_throw + 44
2 CoreFoundation 0x00ead0bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x00e1c966 ___forwarding___ + 966
4 CoreFoundation 0x00e1c522 _CF_forwarding_prep_0 + 50
5 Viewbased 0x000024c3 -[ViewbasedViewController MyThreadedCode] + 78
6 CoreFoundation 0x00e1bc7d __invoking___ + 29
7 CoreFoundation 0x00e1bb51 -[NSInvocation invoke] + 145
8 Foundation 0x000d9495 -[NSInvocationOperation main] + 51
9 Foundation 0x00047b76 -[__NSOperationInternal start] + 747
10 Foundation 0x000477ca ____startOperations_block_invoke_2 + 106
11 libdispatch_sim.dylib 0x01628289 _dispatch_call_block_and_release + 16
12 libdispatch_sim.dylib 0x0162b58a _dispatch_worker_thread2 + 252
13 libSystem.B.dylib 0x9557e781 _pthread_wqthread + 390
14 libSystem.B.dylib 0x9557e5c6 start_wqthread + 30
)
terminate called after throwing an instance of 'NSException'
我确信这是一些愚蠢的事情,我错了,但我看不到它!!
最佳答案
大小写很重要。
[self performSelectorOnMainThread:@selector(reloadMyData)
withObject:nil
WaitUntilDone:YES];
WaitUntilDone:
应该是 waitUntilDone:
:
[self performSelectorOnMainThread:@selector(reloadMyData)
withObject:nil
waitUntilDone:YES];
关于iphone - PerformSelectorOnMainThread 结果为 "unrecognized selector sent to instance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7320901/
在解析twitter数据时,我使用线程调用主URL来下载数据。它完美地完成了下载,但是当我在下载数据时按下后退按钮时,它会抛出performSelectorOnMainThread 消息已释放。我知道
我有一个执行一些任务的线程。 最后,我想运行一个选择器来隐藏带有动画的图像。 [self performSelectorOnMainThread:@selector(finishUpdate) wit
我在执行SelectorOnMainThread时遇到问题,它收到“EXC_BAD_ACCESS”。 有什么想法吗? 谢谢 最佳答案 EXC_BAD_ACCESS 是指您不应该访问的内存。 您尚未提供
我的应用程序的委托(delegate)正在调用 didFinishLaunchingWithOptions 方法,效果很好。这个方法里面有一行: [viewController performSele
我正在尝试将 – performSelectorOnMainThread:withObject:waitUntilDone: 用于我在 Swift 中开发的 Cocoa 应用程序。我需要应用程序等到工
为此我大发雷霆,如有任何想法或建议,我们将不胜感激。 我有一个对象,它从子线程自身调用 performSelectorOnMainThread:withObject:waitUntilDone:。这在
我正在尝试在主线程上执行此操作: [curItem.mButton setBackgroundImage:newArt forState:UIControlStateNormal]; 所以我这样做..
我想用这个方法在一个 block 中重新加载我的表数据: import UIKit import AssetsLibrary class AlbumsTableViewController: UITa
内存管理是手动完成的,这个项目中没有使用ARC.. 消息对象是使用 alloc init 创建的,下面的代码在后台线程上被调用。 我在以下调用之前传递了一个消息对象: [self performSe
我设置了一个 UITableView,它应该在从网站加载某些数据后显示一些信息。为了更新 UI 和完成加载数据,我使用了以下方法: performSelectorOnMainThread:@selec
我正在尝试从 didUpdateToLocation 方法调用一个方法,如下所示。在我的 buttonUpdate 方法中,我正在更新界面,并试图避免如果我将代码块直接放在 didUpdateToLo
我有两种方法: -(void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resource
只是遇到了奇怪的事情。我有以下代码: -(void)ImageDownloadCompleat { [self performSelectorOnMainThread:@selector(up
我必须循环执行某些任务的特定方法。我使用了 performselectoronmainthread wait until done 方法。如果我调用它一次,它工作正常。但是当我在 for 循环中调用它
我一直在寻找这个问题的答案,但还没有找到任何答案。我有一个看起来像这样的方法 dispatch_async(dispatch_get_main_queue()) { self.performS
如果我在分离线程中使用 performSelectorOnMainThread 调用,主线程何时执行请求?它是在完成当前主线程操作后立即执行此操作,还是存在其他类型的层次结构来确定何时执行 perfo
想知道是否有人知道 Cocoa 的“performSelectorOnMainThread:”方法的低级实现细节,或者有好的文档的指针。 我最好的猜测,而且我认为可能非常接近,是它使用 mach 端口
我可以在下面的行中调用 pushIncompleteDataToServer。 [sharedDataController performSelectorOnMainThread:@selector(
在我的应用程序中有一个发布选项,用户可以在其中填写信息并将其发送到我的网络服务。 我在模态视图上有“表单”。当触摸取消按钮时,我用来关闭它的功能。 当发布按钮被触摸时,我启动一个线程,而 ws 正在使
如果我用 [self performSelectorOnMainThread:@selector(uploadDidEnd:) withObject:foo waitUntilDone
我是一名优秀的程序员,十分优秀!