Tag: nsrunloop

NSRunLoop cancelPerformSelectorsWithTarget不工作

我有下面的代码,我没有得到我期望的结果。 #import "CancelPerformSelectorTestAppDelegate.h" @implementation CancelPerformSelectorTestAppDelegate @synthesize window; – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [window makeKeyAndVisible]; for(unsigned int i = 0; i < 10; i++){ NSTimeInterval waitThisLong = i; [self performSelector:@selector(foo) withObject:nil afterDelay: waitThisLong]; } [[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget: self]; return YES; } – (void) foo { static unsigned int timesCalled = 0; ++timesCalled; NSLog(@"%s: I am […]

一个开放的,但不活跃的,在主线程上调度的NSStream可以移动到不同的线程?

我正在使用(而且需要使用)我没有源代码的第三方框架。 第三方框架处理创build一个authentication的客户端/服务器连接,并交回一对开放的NSStreams。 我所面临的挑战是在主线程上安排NSStreams(创buildUI可能无响应的情况 – 我想避免这种情况)。 在stream从第三方框架中被移交的时候,没有networkingstream量正在进行。 所以,我想知道是否可以不计划和重新安排NSStreams。 有谁知道是否有可能取消调度一个开放的NSStream并重新安排在另一个线程上的另一个运行循环? 会造成问题吗? 那里有代码示例吗? 提前致谢! 亚伦

如何testingUIControlEvents是否被触发

我有一个库实现自定义UIControl与一个方法,将调用.valueChanged事件时调用。 我想testing该行为的方法。 我的自定义控件: class MyControl: UIControl { func fire() { sendActions(for: .valueChanged) } } 和testing: import XCTest class ControlEventObserver: NSObject { var expectation: XCTestExpectation! init(expectation anExpectation: XCTestExpectation) { expectation = anExpectation } func observe() { expectation.fulfill() } } class Tests: XCTestCase { func test() { let myExpectation = expectation(description: "event fired") let observer = ControlEventObserver(expectation: […]

后台线程中的SIGSEGV NSRunLoop runMode:beforeDate:

我正在使用以下模式的后台线程: // Defined in .h-file as ivar BOOL backgroundThreadIsAlive; // .m file static NSThread *backgroundThread = nil; – (id)init { if (self = [super init]) { if (backgroundThread == nil) { backgroundThreadIsAlive = YES; backgroundThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain:) object:nil]; [backgroundThread start]; } } return self; } – (void)threadMain:(id)data { NSRunLoop *runloop = [NSRunLoop […]

UI滚动时,应用程序停止从套接字接收数据

我有一个使用UDP套接字接收数据的iPad应用程序。 它有一个UIWebView浏览网页。 但是在UIWebView中滚动的时候,一切冻结,没有数据被接收。 我一直在寻找和它有关的runloops和线程。 但是,如果UIWebView不能运行在另一个线程以外的其他线程,如何在滚动时接收数据? 继续接收数据至关重要。 该项目使用Cocoa AsyncSocket的AsyncUdpSocket类,效果很好。 还有Matt Gallagher的单身课。 一切运行在主线程,UDP接收和UI。 提前致谢!

添加捏/放大效果到一个UIScrollView内的UIImageView

我有一个非常基本的屏幕共享iPhone应用程序,我已经成功地使用UIScrollView内的UIImageView添加捏/缩放效果到我的应用程序。 UIImageView定期从PC接收屏幕内容。 一切工作正常,但只要我滚动/捏/缩放它起作用,但随后停止,更新图像视图内容的委托方法停止发射,即使服务器仍然发送屏幕内容。 整个应用程序似乎被冻结,但没有错误消息/例外/无论。 任何人都可以帮我吗?

在运行循环的开始/结束处执行select器

iOS中的所有事件和方法都使用NSRunLoop处理:用户事件,方法调用,旋转,定时器,连接等。 我的问题是 : 如何在运行循环的精确时刻执行select器作为开始和结束?

需要关于调度队列,线程和NSRunLoop的一些说明

以下是我所知道和了解的内容: 全局队列是一个可以将任务分派给多个线程的并发队列。 执行任务的顺序不能保证。 例如: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { for (int i; i<10; i++) { doTask() } }) 如果我想调度到串行队列,我可以使用 dispatch_async(dispatch_queue_create("my.serial.queue", nil) { … } 每次只有一个任务被调度到一个线程并被执行。 订单是先进先出。 =====我感到困惑和不完全理解======= 主线程有一个NSRunLoop,在主线程中循环任务。 我想知道调度队列和运行循环之间的关系是什么? 我可以理解,如果调度一个任务到主线程,主线程的NSRunLoop得到调度任务并执行它? 把任务分派给多个线程的全局队列呢? iOS / OSX系统不仅自动创build线程,还为每个线程创buildNSRunLoop? 然后每个线程的运行循环从全局队列中获取调度的任务并执行它? 谁知道线程? dispatch_async()和dispatch_sync()函数知道哪个线程调度任务,或者队列知道哪个线程调度任务? 有没有办法从程序调度队列中获取线程的NSRunLoop对象(调度任务)? (这个问题与问题3有关)

“阻塞”主线程(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 […]

NSTimer需要我将它添加到runloop

我想知道是否有人可以解释为什么调度回主队列,并创build一个重复的NSTimer我不得不把它添加到运行环路太火了? 即使在使用performselectorOnMainThread我仍然需要将它添加到RUN LOOP才能启动它。 下面是我的问题的一个例子: #define queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) #define mainqueue dispatch_get_main_queue() – (void)someMethodBeginCalled { dispatch_async(queue, ^{ int x = 0; dispatch_async(mainqueue, ^(void){ if([_delegate respondsToSelector:@selector(complete:)]) [_delegate complete:nil]; }); }); } – (void)compelete:(id)object { [self startTimer]; //[self performSelectorOnMainThread:@selector(startTimer) withObject:nil waitUntilDone:NO]; } – (void)startTimer { NSTimer timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(callsomethingelse) userInfo:nil repeats:YES]; //NSDefaultRunLoopMode [[NSRunLoop currentRunLoop] addTimer:_busTimer […]