0

我是一名 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

谢谢!

4

2 回答 2

2

你说:

所以这里有几件事我不确定。我正在调用一个函数以从 viewDidLoad 进行远程调用这一事实会导致该函数出现问题吗?目前它没有发送远程请求。

随意在 viewDidLoad 中进行任何你想要的调用。只要确保不要做任何会阻塞用户界面的事情(例如一些冗长、复杂的方法)。任何长时间运行的、非 UI 相关的任务都将在单独的队列中异步完成,但那是另一天,在遥远的将来。

无论您是在此处还是在 中执行此操作,application:didFinishLaunchingWithOptions:都取决于您的 UI 将要执行的操作。我们需要更好地了解您的应用程序的流程来回答这个问题。而且我们需要了解EmailUtil呈现本身是如何呈现的(通常这类类使用模态呈现,从另一个视图控制器而不是从application:didFinishLaunchingWithOptions:.

但是,归根结底,我个人application:didFinishLaunchingWithOptions:总是将我带到应用程序的“主”或“主页”页面,如果我有一些我想在第一次使用时展示的东西,但不是主页,然后我将从我的主视图控制器的viewDidLoad. 其他人将application:didFinishLaunchingWithOptions:使用“第一次使用”逻辑进行自定义。这是个人喜好的问题。

另外,我应该为我在这个函数结束时创建的对象释放内存吗?

内存管理的第一条规则是,您始终应该释放您拥有的任何东西(通常是您创建的任何东西),并且只释放您拥有的东西。但是,如果您使用的是 ARC(我强烈鼓励您这样做),这会为您处理好(对象在超出范围时被释放)。

或者我应该把这段代码移到课堂上的另一个地方,在那里有那个代码更有意义吗?

就个人而言,我不会因为主视图控制器出现而让应用程序发送电子邮件而疯狂,因为我认为这只是一个示例而不是真正的应用程序。但是,如果您打算将其放在不同的地方,“发送电子邮件”功能在逻辑上更符合用户点击“发送电子邮件”按钮,而不是跑掉自己做。

关于其他点:

  1. 不过,这段代码很奇怪,因为您正在创建EmailUtil一个本地 var,设置它的一些属性,然后不对其进行任何操作,然后让它超出范围。我想你会想要一些方法来EmailUtil完成它的工作,例如[email sendMessage],或者任何合适的方法。

  2. 您还创建了两个本地变量subjectand body,而不是使用它们并让它们超出范围。我想你想email相应地更新你的对象的属性,但还没有做到这一点。

  3. 您是否有理由编写自己的EmailUtil课程而不是使用MessageUI.framework?希望EmailUtil只是一个很好的包装器MessageUI.framework,或者做一些完全不同的事情,但不复制 Apple 已经提供的功能。

  4. 您说该应用程序将“发出异步请求以管理远程数据库中的该用户”。哇。我现在一直都在做这种事情,但我不建议将与服务器的异步协调作为一个好的第一次项目。希望当您说“最终”时,您的意思是“从现在开始的几个月”,而不是“在接下来的一两周内”。看起来你仍然在基本的视图控制器和内存管理的东西上得到你的海腿。您可能想看看是否可以将应用程序的初始版本的功能限制为不那么雄心勃勃的东西。如果您还没有一些基本技能并尝试做一些复杂的事情,那么您最终可能会手头上一团糟,您会发现自己以后会完全重写。所以,无意冒犯,但是看看你是否能为你的第一个真正的项目想出一些更简单的东西。或者先做几个测试应用程序。只是一个想法。

  5. Lvsti 是非常正确的,典型的对象创建构造是[[EmailUtil alloc] init]. 你所拥有的是等价的,但非标准的。

  6. 我知道这是一项正在进行的工作,但看起来您setEmail:andBody:正在设置属性并发送消息。我建议 (a)为and设置@property条目(它将自动生成和方法,并让您执行类似的操作);(b) 如果你愿意,有一个 init 方便的方法,例如,subjectbodysetSubjectsetBodyemail.subject = @"This is the subject of the email";initWithSubject:body:它将初始化您的对象并设置这两个属性;(c) 有一个单独的方法来实际发送消息。拥有一个看起来像 setter 的东西不是一个好习惯,有点像 setter,但也做更多的物质工作,所有这些都在一个方法中。以“set”开头的方法通常是标准设置器,iOS 约定会导致其他程序员误读您的代码(就像我刚才所做的那样)。通过遵循一些标准的 iOS 约定,如果你让 iOS 程序员参与审查和修改代码会更容易。

于 2012-07-18T14:07:13.413 回答
1

您应该将此代码移至您的 appdelegate 的 application:didFinishLaunchingWithOptions: 方法。从 iOS-Dev-Center

您应该使用此方法来初始化您的应用程序并为运行做好准备。在您的应用程序启动并加载其主 nib 文件后调用它。在调用此方法时,您的应用程序处于非活动状态。

如果你不使用 arc,你唯一应该释放的是 EmailUtil,没有理由手动释放一些东西

于 2012-07-18T14:06:59.823 回答