- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我尝试子类化 NSThread 以便使用一些数据来操作线程。根据文档,我想在 python 中模拟 join() :
join(): Wait until the thread terminates. This blocks the calling thread until the thread whose join() method is called terminates
所以我认为使用 performSelector: onThread: withObject: waitUntilDone:YES 会很好,但它不起作用。它什么都不做,也不会退出,永远运行下去。
这是我的代码:
@interface MyClass : NSThread
@property (strong, nonatomic) NSMutableArray *msgQueue;
@property (assign, nonatomic) BOOL stop;
@end
@implementation MyClass
-(id)init
{
self = [super init];
if (self) {
self.msgQueue = [NSMutableArray array];
self.stop = NO;
[self start];
return self;
}
return nil;
}
-(void)myRun
{
while (!self.stop) {
NSLock *arrayLock = [[NSLock alloc] init];
[arrayLock lock];
NSArray *message = [self.msgQueue firstObject];
[self.msgQueue removeObjectAtIndex:0];
[arrayLock unlock];
NSLog(@"%@", message);
if ([message[0] isEqualToString:@"terminate"]) {
self.stop = YES;
}
}
}
-(void)join
{
[self performSelector:@selector(myRun) onThread:self withObject:nil waitUntilDone:YES];
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
MyClass *a = [[MyClass alloc] init];
[a.msgQueue addObject:@[@"terminate",@"hello world"]];
//[a myRun]; // this line works so the myRun method should be good,
[a join]; // but I want this line work, and I have no idea what the problem is.
}
return 0;
}
最佳答案
来自苹果关于 performSelector:onThread:withObject:waitUntilDone:
的文档:
This method queues the message on the run loop of the target thread using the default run loop modes—that is, the modes associated with the NSRunLoopCommonModes constant. As part of its normal run loop processing, the target thread dequeues the message (assuming it is running in one of the default run loop modes) and invokes the desired method.
您可能从未在线程上启动运行循环,因此它永远不会执行您的 myRun
方法,因为它没有可执行的运行循环。
至于 Merlevede 的回答,myRun
没有在与 join
相同的线程上排队。 join
在您的主线程上被调用,而您正试图在您的辅助线程上排队 myRun
。所以他的理论是不正确的。同样来自 Apple 关于等待参数的文档:
If the current thread and target thread are the same, and you specify YES for this parameter, the selector is performed immediately on the current thread. If you specify NO, this method queues the message on the thread’s run loop and returns, just like it does for other threads. The current thread must then dequeue and process the message when it has an opportunity to do so.
所以即使是在同一个线程,也不会卡在等待中,直接执行就好像你直接调用了方法一样,而不是使用performSelector:
第一名。
关于objective-c - 如何使用[performSelector : onThread: withObject: waitUntilDone:]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22023184/
我正在尝试使用单独的线程来处理某些 API。 问题是我无法将 performSelector:onThread:withObject:waitUntilDone: 方法与我为此实例化的线程一起使用。
将 NSDictionary 文字作为对象传递给 -performSelector:onThread:withObject:waitUntilDone: 将导致其崩溃,因为其他线程的运行循环的自动释放
在我的 viewController 中,我有一个每 20 秒触发一次并调用位置更新的计时器。然后,当位置更新时,我通过 performSelectorOnMainThread 调用一个方法。出于某种
我尝试子类化 NSThread 以便使用一些数据来操作线程。根据文档,我想在 python 中模拟 join() : join(): Wait until the thread terminates.
我有一个 Objective-C 类,它启动一个后台线程并在其上运行一个 NSRunLoop。我想从主线程向后台线程传递消息(是的,专门从主线程)。为此,我计划使用内置的 performSelecto
这个问题在这里已经有了答案: Compiler gives warning on performSelectorOnMainThread:@selector(delegateMethod) (4 个
有没有一种方法可以让我执行一个 block 而不是一个与此方法和类似方法相对应的选择器? 我的观察者可能会接收到不是在主线程上生成的事件。如果主要是面向 UI 的,我希望在主线程上执行该操作。现在,我
我正在编写一个使用 NSURLConnection 的异步 Web 请求的应用程序,因此我有多个线程在运行。为了确保我的应用程序的主要逻辑发生在一个线程上,我大量使用 performSelectorO
我的 iPad 应用程序与 XML 提要同步,在从 NSOperationQueue 执行的 NSOperation 子类中运行同步。当它解析提要时,它会通过 performSelectorOnMai
如果通过 NSObject 的 performSelectorOnMainThread:withObject:waitUntilDone: 调用 myMethod: 中引发的异常会怎样? 特别是,我可
苹果Threading Programming Guide指出: Although good for occasional communication between threads, you sho
我是一名优秀的程序员,十分优秀!