Tag: 信号量

dispatch_semaphore_wait不等待信号量

我开发了以下方法,它检查应用程序与服务器通信的能力。 该方法执行简单的查询,并知道如果得到结果,应该连接的应用程序(基本的ping机制)。 – (BOOL)isAppConnected { __block BOOL isConnected = NO; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [[SFRestAPI sharedInstance] performSOQLQuery:@"SELECT id FROM Account LIMIT 1" failBlock:^(NSError *e) { isConnected = NO; NSLog(@"NOT CONNECTED %@", e); NSLog(@"fail block ON THE MAIN THREAD? %hhd", [NSThread isMainThread]); dispatch_semaphore_signal(semaphore); } completeBlock:^(NSDictionary *dict) { isConnected = YES; NSLog(@"%@", dict); NSLog(@"complete block ON THE […]

ABAddressBookRequestAccessWithCompletion iOS 7和信号量

这个代码之前已经发布了,并且已经被使用,从我可以收集。 我在这种情况下,我需要的代码不会继续,直到我知道我是否有权访问联系人。 在Xcode 5.0.2和iOS 6上,这工作得很好。 在iOS 7上,它永远挂起,然后当我杀了应用程序的对话框出现要求允许访问联系人。 ABAddressBookRef addressBook = ABAddressBookCreate(); __block BOOL accessGranted = NO; if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6 dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { accessGranted = granted; dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); } else { // we're on iOS 5 or older accessGranted = […]

如何在iOS应用程序中实现信号量?

是否有可能在ios应用程序中实现计数信号量?

“阻塞”主线程(dispatch_get_main_queue())和(或不)定期运行currentRunLoop – 有什么区别?

我有以下代码: – (void)test_with_running_runLoop { dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); NSTimeInterval checkEveryInterval = 0.05; NSLog(@"Is main queue? : %d", dispatch_get_current_queue() == dispatch_get_main_queue()); dispatch_async(dispatch_get_main_queue(), ^{ sleep(1); NSLog(@"I will reach here, because currentRunLoop is run"); dispatch_semaphore_signal(semaphore); }); while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW)) [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:checkEveryInterval]]; NSLog(@"I will see this, after dispatch_semaphore_signal is called"); } – (void)test_without_running_runLoop { dispatch_semaphore_t semaphore […]

为什么我会遇到dispatch_once死锁?

我为什么僵持? – (void)foo { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self foo]; }); // whatever… } 我希望foo在第一次通话时被执行两次。

有什么方法可以在代码中“等待……” – 就像空循环一样?

考虑这个代码: [self otherStuff]; // "wait here…" until something finishes while(!self.someFlag){} [self moreStuff]; 请注意,这一切都发生在同一线程 – 我们不想去另一个线程。 otherStuff可以做的事情就像连接到云,从用户获得input等,所以这将需要很多时间,可以遵循许多可能的path。 otherStuff会在otherStuff最终完成时将self.someFlag设置为true。 这是完美的工作,没有任何问题,除了这是一个蹩脚的燃烧处理器像这样的空循环! 很简单,有没有办法说一些像.. halt here, until (some message, interrupt, flag, boolean, whatever?) 而不只是while(!self.someFlag){} (注意,另一种方法是“链接”程序…所以在“otherStuff”的结尾,你和其他所有程序员必须“知道”你不得不下一次调用“moreStuff”当然,当你必须添加新的程序或改变事物的顺序时,这是非常混乱的)干杯! 顺便说一句,关于当你想要不同的线程的情况已经有两个很好的答案。

主线程上的IOS semaphore_wait_trap导致在UI中挂起

我有一个很长的运行在一个asynchronous(串行)工作队列中的函数。 我知道有时候这个函数挂在一个特定的openCV调用中。 由于某种原因,这个挂起也导致主线程挂起。 当暂停和进入debugging模式时,我看到有一个呼叫 semaphore_wait_trap() 在主线程(队列)上 我可以在debugging模式下挂起挂起的线程(我的工作队列),然后这个陷阱消失,GUI再次在手机上响应。 取消暂停工作线程后,GUI响应1-2秒(我怀疑直到这个线程再次被激活),然后UI再次变得无响应。 此线程不会对主线程/队列调用dispatch_sync() IOS是否可能暂停主线程(“陷阱”),因为工作人员长时间运行? 我可以强迫它删除块吗? 我正在添加debugging模式堆栈的一些打印屏幕。 暂停悬挂队列之前: 和挂线: 暂停并暂停错误队列后: