【问题标题】:nsdata that are return fron NSObject class and used in viewcontroller class从 NSObject 类返回并在 viewcontroller 类中使用的 nsdata
【发布时间】:2014-03-03 21:05:25
【问题描述】:

我有一个包含 3 个方法的 NSObject 类:

-(void)RequestForData
{
    #pragma Mark - ASIHTTPRequest

     NSURL *url=[NSURL URLWithString:@"http://srv2.vitaminas.it/pdv"];
     ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
     [request setDelegate:self];
     [request startSynchronous];

}

pragma Mark - HTTP 委托

- (NSData*)requestFinished:(ASIHTTPRequest *)request
{

    NSData *responseData = [request responseData];

   return responseData;

}


- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog(@"%@",error);

} 

我有一个视图控制器类,从视图控制器类的viewDidLoad方法调用-NSObject类的RequestForData方法,

WebServiceMethods *web=[[WebServiceMethods alloc]init];

[web RequestForData];

arr_JsonData=[NSJSONSerialization JSONObjectWithData:web  options:NSUTF8StringEncoding error:Nil];

NSLog(@"%@",arr_JsonData);

[self.tableView reloadData];

但我想使用从NSObject 类(即return responsedata;)返回的NSData 到视图控制器类中。

我希望 NSData 进入 arr_JsonData (NSMutuableArray)

我能做什么?

【问题讨论】:

  • 它是一个对象数组,例如 ( { keyname=value keyname=value }, { keyname=value keyname=value } )

标签: ios objective-c


【解决方案1】:

responseData 设为类级别变量。不要在requestFinished 方法中创建它的本地实例。

【讨论】:

    【解决方案2】:

    您的问题是回调。您应该将您的viewController 作为WebServiceMethods 的代表(或使用块更好),以便在请求完成并填充您的arr_JsonData 时得到通知

    @protocol WebServiceMethodsDelegate
    
    - (void)webServiceMethodsDidFinishWithSucess:(NSString *)response; // give this méthode an appropriate name.
    - (void)webServiceMethodsDidFailWithError:(NSError *)error;
    @end
    
    
    @interface WebServiceMethods : NSObject
    
    @property (nonatomic,weak) id <WebServiceMethodsDelegate> delegate;
    
    @end
    
    @implemntation WebServiceMethods : NSObject
    
    
    - (void)requestFinished:(ASIHTTPRequest *)request
    {
       NSString *responseString = [request responseString];
      [self.delegate webServiceMethodsDidFinishWithSucess:responseString];
    
    }
    
    - (void)requestFailed:(ASIHTTPRequest *)request
    {
       NSError *error = [request error];
    [self.delegate webServiceMethodsDidFailWithError:error];
    }
    
    @end
    

    让你的viewController符合WebServiceMethodsDelegate协议。

    @interface yourViewController : UIViewController <WebServiceMethodsDelegate>
    ...
    @end
    

    并且知道你的 viewController 的 viewDidLoad :

    WebServiceMethods *web=[[WebServiceMethods alloc]init];
    web.delegate = self;
    
    [web RequestForData];
    

    将委托方法也放在 viewController.m 中

    - (void)webServiceMethodsDidFinishWithSucess:(NSString *)response {
    // here you can parse the response and reload your tableView
    .....
    [self.tableView reloadData];
    }
    
    - (void)webServiceMethodsDidFailWithError:(NSError *)error {
    // handle the errors
    }
    

    PS:你的代码有很多问题:

    1. 不要使用ASHTTPRequest,它不会被维护。你可以使用AFNetworking.AFNetworking

    2. 将您的 WebServiceMethods 作为共享实例。

    ....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多