标签: runloop

FoundationTool中的Runloop

我正在写一个基础工具.我必须将线程分成不同的正在进行的任务.

我试图做线程,但它一直在崩溃.最后我想出了我需要运行自己的runloop的原因.

有人可以用一些简单的例子来帮助吗?我试过跟随代码,但它不起作用.我每次运行它都会遇到异常崩溃?如何在Foundation工具中运行线程?

@interface MyClass : NSObject
{
}
-(void) doSomething;
@end

@implementation MyClass
-(void) RunProcess:
{
    printf("test");  
}
-(void) doSomething:
{
    [NSThread detachNewThreadSelector: @selector(RunProcess:) toTarget:self withObject: nil];  
}
@end

int main(void)
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    MyClass *myObj = [[MyClass alloc] init],
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 myObj selector:@selector(doSomething:) userInfo:nil repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

    [pool drain];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c appkit runloop

2
推荐指数
1
解决办法
270
查看次数

autorelease和runloop和线程的关系?

我有一个关于autorelease的问题,现在我有以下代码:

int main(int argc, char *argv[]){
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}}
Run Code Online (Sandbox Code Playgroud)

doc在@autoreleasepool {}结尾处说标记为autorelease的对象将收到一条释放消息.但是UIApplicationMain永远不会返回,这意味着流程永远不会到达@autoreleasepool的末尾,那么标记为autorelease的对象将永远不会释放,直到应用程序死掉.自动释放没有意义.....

我问过有人说iOS系统会生成一些线程,(你知道,一个线程,一个runloop).他说runloop会创建自动释放池.所以自动释放对象将在thead或runloop结束时释放.但在大多数情况下我们使用主线程.所以他所说的并不能说服我.

什么是使用自动释放的适当时间.它困惑了我很长一段时间.

我得到另一个观点,当一个runloop结束时,autorelease对象将被释放(主runloop将存在所有应用程序的生命?)所以我不确定..

任何要点和相关文件将不胜感激!

autorelease nsthread nsautoreleasepool runloop ios

2
推荐指数
1
解决办法
782
查看次数

UndoManager运行循环分组将如何在不同的线程上下文中受到影响?

TLDR:我想知道UndoManager从后台线程使用时如何基于运行循环自动撤消分组,而我的最佳选择是什么。


我使用UndoManager(以前NSUndoManager在与iOS和MacOS的目标定制的斯威夫特框架)。

在框架中,工作体面量呈现背景GCD串行队列的地方。我了解UndoManager每个运行循环周期会自动将顶级注册的撤消操作分组,但是我不确定不同的线程情况将如何影响这种情况。

我的问题:

  • 什么影响,如果有的话,将在下列情况下对UndoManager的run环路注册撤消操作的分组?
  • 假设所有需要撤消注册的更改都将在单个后台串行分派队列中进行,哪种情况(除了情况1,这是不可行的)最适合提供自然分组?

在下面的所有情况下,假定methodCausingUndoRegistration()并且anotherMethodCausingUndoRegistration()没有幻想,可以UndoManager.registerUndo在没有任何分派的情况下从调用它们的线程进行调用。

情况1:在主线程上内联

// Assume this runs on main thread
methodCausingUndoRegistration()
// Other code here
anotherMethodCausingUndoRegistration()
// Also assume every other undo registration in this framework takes place inline on the main thread
Run Code Online (Sandbox Code Playgroud)

我的理解:这就是UndoManager预期的用法。上面的两个撤消注册都将在同一运行循环周期中进行,因此将被放置在同一撤消组中。

情况2:主线程上的同步调度

// Assume this runs on an arbitrary background thread, possibly managed by GCD.
// It is guaranteed not to run on …
Run Code Online (Sandbox Code Playgroud)

macos grand-central-dispatch runloop ios swift

2
推荐指数
1
解决办法
228
查看次数

DispatchQueue 是使用 RunLoop 吗?

每个人Thread都有自己的RunLoop,如何DispatchQueue与他们互动?是DispatchQueue使用RunLoop分派任务Thread还是以其他方式完成?

nsoperationqueue grand-central-dispatch runloop swift dispatch-queue

2
推荐指数
1
解决办法
1334
查看次数

Cocoa应用程序有一个主循环吗?

在Linux下的X11和使用GTK +你有一个叫做"主循环"的东西.一旦启动主循环,就会有一个在应用程序主线程中运行的计时器.您可以将该计时器设置为回调函数,并且您有一个非常好的应用程序范围的计时器.

这是示例代码:

GMainLoop *loop;

if(!loop_running)
{
      display = XOpenDisplay( NULL );
      loop = g_main_loop_new(NULL, FALSE);
      g_timeout_add(1000, (GSourceFunc)callback, NULL); //1 sec laps   
      g_main_loop_run(loop);  //to stop use g_main_loop_quit ()  with the "loop" as arg
      loop_running=1;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试为Mac OS X编写类似的应用程序而不是主循环,我使用的是一个简单的计时器:

- (void) handleTimer: (NSTimer *) timer
{
    CopyDataToDB();
} // handleTimer

- (IBAction)startStopAction:(id)sender
{

   isOn=!isOn;
   if(isOn)
   {
       // Add our timers to the EventTracking loop       
       [[NSRunLoop currentRunLoop] addTimer: time forMode: NSEventTrackingRunLoopMode];

       // Add our timers to the ModelPanel loop       
       [[NSRunLoop currentRunLoop] addTimer: …
Run Code Online (Sandbox Code Playgroud)

cocoa runloop

1
推荐指数
1
解决办法
2432
查看次数

在iOS中应用程序处于后台时如何调用Method?

我有一个类名,因为myClassCalculate具有以下方法

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

NSLog(@"Accelerometer is called");

}
Run Code Online (Sandbox Code Playgroud)

我正在制作对象

    - (void)applicationDidFinishLaunching:(UIApplication *)application {    


    // Override point for customization after app launch
       myObject = [[myClassCalculate alloc] init];
Run Code Online (Sandbox Code Playgroud)

现在当应用程序进入后台时,我想要这个

    - (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
Run Code Online (Sandbox Code Playgroud)

我该怎么做,以便在app后台调用此方法

谢谢

iphone accelerometer runloop

1
推荐指数
1
解决办法
2427
查看次数

游戏循环更新方法中使用的时间增量或时间戳是多少?

例如在cocos2D中:

- (void)update:(ccTime)delta
Run Code Online (Sandbox Code Playgroud)

谁能解释这些时间增量或时间戳用于什么?它们如何与游戏世界的更新相关?是因为我们不能可靠地知道fps而不应该只依赖于基于-update调用的增量属性更新?

opengl-es game-engine cocos2d-iphone runloop ios

0
推荐指数
1
解决办法
367
查看次数