Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios -[nsrunlop runUntilDate:]消耗100%的CPU_Ios_Multithreading_Nsrunloop_External Accessory - Fatal编程技术网

Ios -[nsrunlop runUntilDate:]消耗100%的CPU

Ios -[nsrunlop runUntilDate:]消耗100%的CPU,ios,multithreading,nsrunloop,external-accessory,Ios,Multithreading,Nsrunloop,External Accessory,我正在构建一个与外部附件(因此与ExternalAccessority框架)接口的应用程序 此接口的一部分是等待外部设备的输入/输出流上发生事件 为此,我使用了一个线程,并在nsrunlop中阻止它,以确保它一直在等待事件 - (void)eventThreadSelector { // Setting up the environment self.session = <got the EASession>; self.inputStream = [sel

我正在构建一个与外部附件(因此与ExternalAccessority框架)接口的应用程序

此接口的一部分是等待外部设备的输入/输出流上发生事件

为此,我使用了一个线程,并在nsrunlop中阻止它,以确保它一直在等待事件

- (void)eventThreadSelector
{
    // Setting up the environment
    self.session = <got the EASession>;

    self.inputStream = [self.session inputStream];
    self.inputStream.delegate = self;
    [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.inputStream open];

    self.outputStream = [self.session outputStream];
    self.outputStream.delegate = self;
    [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.outputStream open];

    // Waiting for events coming from the NSStreams
    while (![[NSThread currentThread] isCancelled]) {
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]];
    }

    // When the device is unplugged, 
    [self.inputStream close];
    [self.inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    self.inputStream.delegate = nil;
    self.inputStream = nil;

    [self.outputStream close];
    [self.outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    self.outputStream.delegate = nil;
    self.outputStream = nil;

    self.session = nil;
}

- (void)accessoryDidDisconnect:(EAAccessory *)accessory
{
    DDLogVerbose(@"EID: Got accessoryDidDisconnect notification on main thread? %i", [[NSThread currentThread] isMainThread]);

    [self.eventThread cancel];
    self.eventThread = nil;
}
-(void)事件线程选择器
{
//建立环境
self.session=;
self.inputStream=[self.session inputStream];
self.inputStream.delegate=self;
[self.inputStream ScheduleUnloop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
[self.inputStream open];
self.outputStream=[self.session outputStream];
self.outputStream.delegate=self;
[self.outputStream scheduleInRunLoop:[NSRunLoop currentlunloop]forMode:NSDefaultRunLoopMode];
[self.outputStream open];
//等待来自NSStreams的事件
而(![[NSThread currentThread]已取消]){
[[NSRunLoop currentRunLoop]runUntelDate:[NSDate dateWithTimeIntervalSinceNow:.1]];
}
//拔下设备插头后,
[自输入流关闭];
[self.inputStream removeFromRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
self.inputStream.delegate=nil;
self.inputStream=nil;
[self.outputStream close];
[self.outputStream removeFromRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
self.outputStream.delegate=nil;
self.outputStream=nil;
self.session=nil;
}
-(无效)附件断开:(eA附件*)附件
{
DDLogVerbose(@“EID:Gett accessoryDidDisconnect通知主线程?%i”,[[NSThread currentThread]isMainThread]);
[self.eventThread取消];
self.eventThread=nil;
}
到目前为止,所有这些都很有效:)但有一件事我不能理解

当我拔下外部设备时,处理器会短暂跳到100%及以上。我做了一点调查,这似乎与nsrunlop发疯有关。CPU峰值对UI有负面影响:(


如何避免处理器使用高峰?

你解决过这个问题吗?我确实有完全相同的问题。哦,这是一个好问题。那个特定的项目成功了,我不记得这个问题会一直存在。我想它是可以解决的,或者有其他方法可以解决。所以我不能告诉你比这个更好的方法“继续看,有解决办法。”祝你好运:)