我正在尝试构建一个超级简单的Cocoa应用程序,基本上是一个具有一个while循环的函数(例如,main())。它会做一些事情,做一个卷曲请求,然后在重新开始之前等待几秒钟。
我的项目都在XCode中设置了所有必要的变量和函数,但我不知道在哪里放置我的main()函数来完成所有工作。
我在哪里定义主要功能?
答案 0 :(得分:7)
Cocoa非常注重事件驱动的编程。为此,main()函数通常只启动主runloop,然后应用程序委托可以启动它想做的任何事情。也就是说,编写一个使用main()的非基于事件的可可程序当然可以做更复杂的事情。在这种情况下,它的工作原理与C中的基本相同。
Cocoa With Love刚刚有一篇关于Minimalist Cocoa programming的帖子可能会引起关注。它使用main()来做一些工作。这不是我推荐在你自己的应用程序中模拟的东西,但它肯定是可能的。
答案 1 :(得分:5)
如果您根据通常的Cocoa架构设计应用程序,那么您并不真正将自己的代码放在main中。整个应用程序应该是事件驱动的(事件是来自用户的UI交互,网络事件等)。
那说,有一个主要功能。如果您在XCode中创建了一个默认的Cocoa项目,那么main函数将位于一个名为“main.m”的文件中。它将像C中的main函数一样运行。您将看到NSApplicationMain()中有一个调用。这就是启动Cocoa应用程序运行的原因(创建应用程序,加载主nib文件,开始运行主运行循环等)。 NSApplicationMain()在应用程序退出之前不会返回,所以如果你真的想把东西放在main()中,你需要把它放在对NSApplicationMain()的调用之上。
同样,这不是正常的“可可方式”,但如果没有关于你想做什么的更多信息,很难给你更多的建议。
答案 2 :(得分:4)
正如其他人已经回答的那样,可以按照您建议的方式实施您想要执行的操作,即在while
内运行main
循环。
然而,这不是编写Cocoa应用程序的最佳方式,它会在几秒钟内重新加载一次URL。在不同的环境中,有一种不同的标准方式来做事。所以,你有时需要取消学习你习惯的东西。你可能想过:我想做X
。在语言/环境A
中,我的编码类似于P
来执行X
。现在我想使用语言/环境B
。我该如何实施P
?这不是适应新环境的方法。请问,我应该如何X
在环境中B
?
最可可式的方式是:
在应用程序委托中,实施applicationDidFinishLaunching:
。我们将设置NSTimer
。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSTimer*timer=[NSTimer scheduledTimerWithTimeInterval:5
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES];
}
这会创建一个在五秒内触发一次的计时器,并且每次触发它都会调用由timerFired:
指定的应用委托自身的方法self
。有关NSTimer
的更多信息,请阅读this apple document。
实施timerFired:
。
- (void)timerFired:(NSTimer*)theTimer{
// do whatever you want. you can use plain C to invoke curl,
// or if you want you can use Cocoa methods to access a URL.
}
没有第四步!
main
功能由模板提供。它调用NSApplicationMain
,它建立了Cocoa系统。最后,它会为您的代理人调用applicationDidFinishLaunching:
。您回复该消息。然后你设置一个计时器。计时器会调用您为指定的方法。然后再次回复该消息。这基本上是Cocoa的工作方式。 Cocoa系统要求你做某事,所以你要做点什么。与您在Applescript中编程的相比,您对程序流程的控制变得相当被动。
答案 3 :(得分:2)
要添加到Andrew Madsen的答案中,最好的办法是从Xcode项目模板开始。它会为你设置一个骨架main(),一个XIB,一个plist和其他标准的Cocoa东西。