我是iOS的新手,我想了解一些在iOS应用中执行操作的“良好做法”方法。
我有一个ViewController,我将其作为应用程序启动时被调用的控制器。在其中,我看到了一个名为viewDidLoad的函数,我试图对其进行修改以检查用户是否具有user_id,然后调用一个函数,该函数最终会发出异步请求来管理远程数据库中的该用户。这是我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
EmailUtil *email = [EmailUtil alloc];
email = [email init];
// This is just a test call to the function that would make a remote server request
[email setEmail: @"test" andBody: @"hello"];
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
if([standardUserDefaults objectForKey:@"user_id"] == nil)
{
NSLog(@"First time");
[standardUserDefaults setBool:YES forKey:@"user_id"];
}
else
{
NSString *subject = @"subject";
NSString *body = @"bod";
NSLog(@"Not first time");
}
}
因此,我对此不确定。我正在调用某个函数以从viewDidLoad进行远程调用的事实会导致该函数出现问题吗?当前它没有发送远程请求。
另外,是否应该在此函数结束时为我创建的对象释放内存?
还是我应该将这段代码移到班级的另一个地方,在那里在那里放些代码会更有意义?
我这样称呼电子邮件对象:
[email setEmail: @"test" andBody: @"hello"];
这是EmailUtil类的代码:
//
// EmailUtil.m
//
#import "EmailUtil.h"
@implementation EmailUtil
-(void) setEmail: (NSString *) subject andBody: (NSString *) body
{
NSString *final_url = [NSString stringWithFormat:@"http://www.my_url.com?subject=%@&body=%@",subject, body];
NSURL *url = [NSURL URLWithString:final_url];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url ];
// TODO: ok I dont really understand what this is
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
NSLog(@"On return");
NSLog(@"This is data: %@" , data);
NSLog(@"This is response: %@" , response);
NSLog(@"This is error: %@" , error);
NSLog(@"OK");
}];
}
@end
谢谢!
最佳答案
你说:
因此,我对此不确定。我可以这样的事实吗
我正在调用一个函数以从viewDidLoad进行远程调用的原因
该功能有问题吗?当前它没有发送遥控器
请求。
随时在viewDidLoad中进行所需的任何调用。只需确保不要做任何会阻塞UI的事情(例如,一些冗长而复杂的方法)。任何长时间运行且与UI无关的任务都将在单独的队列中异步完成,但这将是遥远的未来。
无论您是在此处还是在application:didFinishLaunchingWithOptions:
中执行此操作,都取决于您的UI要做的事情。我们需要更好地了解您的应用程序流程才能回答该问题。而且,我们需要了解EmailUtil
如何呈现自身(通常这类类使用模式表示,这是从另一个视图控制器而不是从application:didFinishLaunchingWithOptions:
进行的有意义的工作)。
但是,最重要的是,我个人总是将application:didFinishLaunchingWithOptions:
带到应用程序的“主页”或“主页”页面,并且如果我想在初次使用时展示这些内容,而不必主页,然后从主视图控制器的viewDidLoad
调用它。其他人将使用“首次使用”逻辑来自定义application:didFinishLaunchingWithOptions:
。这是个人喜好问题。
另外,是否应该在此函数结束时为我创建的对象释放内存?
内存管理的第一条规则是,您总是应该释放自己拥有的任何东西(通常是您创建的任何东西),而只释放自己拥有的东西。但是,如果您使用的是ARC(我强烈建议您这样做),这将为您解决(对象在超出范围时被释放)。
还是我应该将此代码移到班级中的其他位置
在那儿有那个代码会更有意义?
就我个人而言,我并不为仅仅因为出现了主视图控制器而让应用程序发送电子邮件感到疯狂,因为我认为这只是一个示例,而不是真正的应用程序。但是,如果您打算将其放置在其他位置,则从逻辑上讲,“发送电子邮件”功能更容易吸引用户点击“发送电子邮件”按钮,而不是自行运行。
在其他方面:
但是,这段代码很奇怪,因为您要创建本地变量EmailUtil
,设置设置其某些属性,然后不对其进行任何操作,然后使其超出范围。我想你想用某种方法使EmailUtil
发挥作用,例如[email sendMessage]
或任何适当的方法。
您还将创建两个本地变量subject
和body
,并且不使用它们并使它们超出范围。我想您想相应地更新email
对象的属性,但还没有做到这一点。
您是否有理由在编写自己的EmailUtil
类而不是使用MessageUI.framework
?希望EmailUtil
只是MessageUI.framework
的一个很好的包装,或者做一些完全不同的事情,但不能复制Apple已经提供的功能。
您说过,该应用程序将“发出异步请求以管理远程数据库中的该用户”。哇。现在,我一直都在做这种事情,但是我不建议与服务器进行异步协调是一个很好的首次项目。希望当您说“最终”时,您的意思是“从现在开始的几个月”,而不是“在接下来的一两周”。看起来您仍然对基本的视图控制器和内存管理方面有所了解。您可能想看看是否可以将应用程序初始版本的功能限制在不太雄心的东西上。如果您还不具备一些基本技能,并且尝试做一些复杂的事情,那么最终可能会遇到麻烦,您将发现自己后来完全被重写了。因此,没有冒犯之处,但请看您是否可以为您的第一个实际项目想出一些简单的方法。或者先做几个测试应用。只是一个想法。
Lvsti非常正确,典型的对象创建构造为[[EmailUtil alloc] init]
。您所拥有的是等效的,但不是标准的。
我知道这是一个正在进行的工作,但看来您的setEmail:andBody:
正在设置属性并发送消息。我建议(a)为@property
和subject
设置body
条目(它们将自动生成setSubject
和setBody
方法,并允许您执行email.subject = @"This is the subject of the email";
之类的操作); (b)如果需要,可以使用一种初始化方便的方法,例如initWithSubject:body:
,它将对您的对象进行初始化并设置这两个属性; (c)具有实际发送消息的单独方法。有一种看起来像二传手的东西,像二传手的东西,但又用单一方法做更多实质性事情的方法不是一个好习惯。以“ set”一词开头的方法通常是标准的setter,iOS约定会导致其他程序员误读您的代码(就像我刚才所做的那样)。通过遵循一些标准的iOS约定,如果让iOS程序员参与审阅和修改代码将变得更加容易。
关于ios - iOS-在 View Controller 中,放置用户 session 管理代码的最合逻辑的地方在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11543037/