停止NSApplication主事件循环

时间:2017-12-31 09:08:07

标签: objective-c cocoa nsapplication

我的应用程序包含以下单个.m文件:

#import <Cocoa/Cocoa.h>

int main(int argc, char* argv[]) {
  [[[NSThread alloc] initWithBlock: ^{
    sleep(2);
    dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"Stop");
      [[NSApplication sharedApplication] stop:nil];
    });
  }] start];
  [[NSApplication sharedApplication] run];
  NSLog(@"Run finished");
  return 0;
}

根据the developer documentationstop应停止主循环(run),但它不会(至少不在OS X 10.12和10.13上)。还有terminate,但这很快就退出了该计划。我还尝试设置一个NSApplicationDelegate来实现applicationShouldTerminate,但是从不调用它。

如何确保主要运行循环(干净地)退出?

注意:共享应用程序主循环是必要的,因为其他地方正在进行UI工作。更具体地说,这会在Go WDE UI库中产生问题,该库使用Cocoa为Go应用程序提供一个窗口。

2 个答案:

答案 0 :(得分:2)

documentation for -stop:说:

  

[C]从定时器或运行循环观察器例程中获取此方法不会停止运行循环,因为它们不会导致发布NSEvent对象。

调度到主队列的块类似,因为它不发布事件。您可以在致电<script src="<?php echo base_url() ?>dropdown/js/jquery.js"></script> <script src="<?php echo base_url() ?>dropdown/js/bootstrap.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ var cat_id = $("#category option:selected").val(); if(cat_id != '') $.fn.ajaxCall(cat_id); ajaxCall(category_id); $('#category').on('change', function(){ var category_id = $(this).val(); if(category_id != '') $.fn.ajaxCall(category_id); }); $.fn.ajaxCall = function(category_id){ $.ajax({ url:"<?php echo base_url() ?>welcome/get_sizes", type: "POST", data: {'category_id' : category_id}, dataType: 'json', success: function(data){ $('#sizes').html(data); }, error: function(){ alert('Error occur...!!'); } }); } }); </script> 后尝试发布NSEventTypeApplicationDefined个活动。

答案 1 :(得分:0)

在进一步研究之后,似乎UI循环stop请求仅在 UI 事件之后处理(因此不仅仅是在主循环事件之后)。因此,它可以响应UI事件,但不会像我在我的示例中那样在线程中工作。

stop请求后触发UI事件(例如,程序化调整大小对我有用)会导致循环结束。