ios - 不同类中的 NSURLconnection

标签 ios objective-c nsurlconnection

我正在尝试开发一个应用程序以从网络服务接收数据以在某些 View 中显示。 在应用程序的第一个版本中,我只有一个 View Controller 和一个对 Web 服务的 GET 请求(通过 NSURLconnection):NSURLconnection 的所有方法都在 Viewcontroller 中并且一切正常。

现在我需要添加其他 View 并发出一些其他 GET 请求,所以我认为最好的办法是应用 MVC 模式:特别是我创建了一个类 (FV_Data),我将所有 GET 请求和管理 NSURL 连接,而在每个 ViewController 中,我为所需的 GET 请求调用方法(在 FV_Data 类中)。

我的问题是如何将包含来自 Web 服务的数据的数组返回到请求数据的 ViewController:在我的第一个测试中,NSURLconnection 正确启动并且数组(在 connectionDidFinishLoading 方法中)充满了来自 Web 服务的数据,但在 View Controller 中数组为空。

我读过不同的帖子,但我不明白我做错了什么。

这是我编写的代码(我省略了有效方法中的代码)。

谢谢, 科拉多

FV_Data.h

#import <Foundation/Foundation.h>

@interface FV_Data: NSObject {

    NSMutableData *responseStatistic;
    NSMutableData *responseGetStatus;

    NSURLConnection *connectionStatistic;
    NSURLConnection *connectionGetStatus;
}

-(NSArray *)richiediGetStatistic;
-(NSArray *)richiediGetStatus;


@property (nonatomic, retain) NSArray *ArrayStatistic;
@property (nonatomic, retain) NSArray *ArrayGetStatus;


@end

FV_Data.m

#import "FV_Data.h"

@implementation FV_Data

-(id)init {
    self = [super init];
    return self;
}

-(void)richiediGetStatistic{
    ...
}

-(void)richiediGetStatus{
    ...
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
...
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
   ...
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

    if(connection == connectionStatistic){
        NSString *responseStatisticString = [[NSString alloc] initWithData:responseStatistic encoding:NSUTF8StringEncoding];
        self.ArrayStatistic = [responseStatisticString componentsSeparatedByString:@","];
    }

    else if(connection == connectionGetStatus){
        NSString *responseGetStatusString = [[NSString alloc] initWithData:responseGetStatus encoding:NSUTF8StringEncoding];
        self.ArrayGetStatus = [responseGetStatusString componentsSeparatedByString:@","];
    }
}

@end

FV_Live_ViewController.h

#import <UIKit/UIKit.h>
#import "FV_Data.h"

@interface FV_Live_ViewController : UIViewController {
    IBOutlet UILabel *energia;
}

@property (nonatomic, retain) FV_Data *PVOutputData;

@end

FV_Live_ViewController.m

#import "FV_Live_ViewController.h"

@implementation FV_Live_ViewController

-(void)viewWillAppear:(BOOL)animated{

    self.PVOutputData = [[FV_Data alloc] init];

    [self.PVOutputData richiediGetStatistic];

    energia.text = [self.PVOutputData.ArrayStatistic objectAtIndex:0];
}

@end

最佳答案

天哪...网络请求需要时间才能完成,因此您应该在 connectionDidFinishLoading 之后设置您的 View (energia.text):
对不起,看来你是在发明自行车。如果你知道这些 block 在 Objective-C 中是如何工作的,我建议使用 AFNetworking框架。
如果你不知道 block 是如何工作的-阅读 Apple doc about blocks首先 - 确实有必要成功地为 iOS/OS X 开发

关于ios - 不同类中的 NSURLconnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18988071/

相关文章:

ios - 加载所有内容后如何更改uitableview单元格的字体大小

ios - 在 ios6 上使用 Xcode 5 追踪僵尸

objective-c - 使用从测试方法调用的方法的类的 OCMock

iphone - 如何在 NSURLConnection 中放置阿拉伯语

iphone - 如何在 iOS 中检索 ssl 服务器证书?

cocoa - 为什么我收到 1 个 302 响应时会得到两个重定向响应?

ios - 在启动屏幕中将按钮设为圆形?

ios - 将数组中的字符转换为整数

ios - Swift 以十进制获取 characteristic.value

ios - 在 UIImage imageNamed 中使用外部图像