如何在多个类中使用单个网络连接

时间:2013-11-17 04:31:36

标签: ios objective-c

伙计们帮助解决我刚接触编程的问题,因此我一般都有问题,我不知道如何使用网络!我写了一个类,我在登录后登录网站我不能使用连接在其他视图中发送其他请求! 这是我写的:

- (IBAction)loginClicked:(id)sender {
    @try {

        if([[txtUserName text] isEqualToString:@""] || [[txtPassword text] isEqualToString:@""] ) {
            [self alertStatus:@"Пожалуйста заполните все поля!!!" :@"Авторизация не удолась!"];
        } else {

            NSString *post =[[NSString alloc] initWithFormat:@"login=%@&pass=%@",[txtUserName text],[txtPassword text]];


            NSURL *url=[NSURL URLWithString:@"http://chgu.org/?mobile=1"];

            NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

            NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];

            NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
            [request setURL:url];
            [request setHTTPMethod:@"POST"];
            [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
            [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
            [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
            [request setHTTPBody:postData];

            NSError *error = [[NSError alloc] init];
            NSHTTPURLResponse *response = nil;
            NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

            if ([response statusCode] >=200 && [response statusCode] <300)
            {
                NSData *responseData = [[NSData alloc]initWithData:urlData];
                NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];

                if([jsonObject objectForKey:@"error"])
                {
                    [self alertStatus:@"Ошибка ввода данных" :@"Ю хав а трабл"];

                } else {

                    [self alertStatus:@"Авторизация прошла успешно" :@""];
                }

            } else {
                if (error) NSLog(@"Error: %@", error);
                [self alertStatus:@"Connection Failed" :@"Login Failed!"];
            }
        }
    }
    @catch (NSException * e) {
        NSLog(@"Exception: %@", e);
        [self alertStatus:@"Login Failed." :@"Login Failed!"];
    }

    [txtUserName resignFirstResponder];
    [txtPassword resignFirstResponder];
}

当我移动到不同的视图时,如何使用此连接! 请告诉我整晚坐在电脑前的任何事情都无法弄清楚

1 个答案:

答案 0 :(得分:0)

您有正确的想法,假设您希望通过该委托协议在这些控制器之间进行相对紧密的耦合。

由于在设置了委托属性之前,两个控制器都不知道另一个控制器,因此你需要有一些引用它们的对象连接该关系。在您的情况下,可能是可以创建两个控制器的应用程序委托,将一个设置为另一个的委托,并将它们传递给标签栏控制器。

您可能真正想要的是让app delegate为两个控制器提供对某个共享模型对象的引用。当您点击按钮时,您的FirstViewController可以更新该模型,并且您的SecondViewController可以观察模型的更改以更新其显示(或者仅在基于当前模型状态显示时更新其视图)。这样你的控制器就不需要彼此了解任何事情了。

在secondVC中

,定义如下内容:

@protocol secondVCDelegate

@interface secondVC : UIViewController
    @property (nonatomic, assign) id<secondVCDelegate> delegate;
@end


@optional
-(void)someDelegateMethod:(secondVC*)viewController;

@end

在创建secondVC实例时,您必须将secondVC的委托属性分配给self!像这样:

// in firstVC
secondVC vc = [[secondVC alloc]...];
vc.delegate = self;
[navcontroller pushVC:vc];
the line vc.delegate = self; does the trick.
希望它有所帮助...