逻辑问题 - NSObject类 - 初学者

时间:2012-03-14 16:17:48

标签: iphone objective-c cocoa-touch

我有两个问题。

1。)我正在创建一个NSObject类,我在其中有以下代码。 (ASIHTTPRequest POST)。 名为NSObject类的名称为SendToServer。我把课程称为如下;

SendToServer *sv = [[SendToServer alloc]];
sv.grabURLInTheBackground ;
NSLog(@"This line is executed ");

以下是SendToServer NSObject类中的代码。

- (void)grabURLInTheBackground
{
   if (![self queue]) {
      [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
   }

   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request setDidFinishSelector:@selector(requestDone:)];
   [request setDidFailSelector:@selector(requestWentWrong:)];
   [[self queue] addOperation:request]; //queue is an NSOperationQueue
}

- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
}

- (void)requestWentWrong:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

问题是,代码执行行sv.grabURLInTheBackground ;,在执行requestDonerequestWentWrong方法之前,它执行NSLog(NSLog(@"This line is executed ");

我希望我的程序要完成SendToServer NSObject类中的所有操作,然后执行NSLog(按顺序)。

首先在该方法/类中的所有活动结束后执行sv.grabURLInTheBackground ;,然后返回到代码并执行另一行NSLog(@"This line is executed ");

2。)我需要在执行requestDone方法时返回一个String。如何修改代码来执行此操作;

- (NSString * )requestDone:(ASIHTTPRequest *)request {
}

但如何编辑[request setDidFinishSelector:@selector(requestDone:)];,以获取上述代码?

-------------------------------------------- -------------------------------------------------- --------------------------------------------

修改

我这样做是为了用户登录。点击按钮后,我将调用grabURLInTheBackground课程中的NSObject方法。并且viewcontroller需要知道用户登录是成功还是失败。

SendToServer *sv = [[SendToServer alloc]];
[sv grabURLInTheBackground] ;
NSLog(@"User login SUcess or failed %@", [sv userloginSucessOrFail]);

例如,如果用户登录成功或失败,则返回[sv userloginSucessOrFail]

这里的主要内容是,在调用[sv grabURLInTheBackground]之后,它会直接执行NSLog(@"User login SUcess or failed %@", [sv userloginSucessOrFail]);代码行。

我想要的是,我需要找到一种方法让我的ViewCOntroller知道用户登录是成功还是失败。

1 个答案:

答案 0 :(得分:0)

首先:在你的对象上调用init。

第二:grabURLInTheBackground是一种方法而不是属性。它应该用方括号调用

所以你的代码变成了:

SendToServer *sv = [[SendToServer alloc] init];
[sv grabURLInTheBackground];
NSLog(@"This line is executed ");

要完成第1点,您需要发出同步请求

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
  NSError *error = [request error];
  if (!error) {
    NSString *response = [request responseString];
  }

问题是,如果在主线程上执行此代码是阻塞(不好)......

第二点。你不能。

编辑: 您需要做的是以下步骤:

  • 在调用grabURLInTheBackground之前,您必须通知用户请求正在等待...例如放置UIActivityIndi​​cator或禁用UI,...

  • 当您收到回调时,请更新UI:隐藏活动指示器,重新启用UI ...或者如果请求失败,请通知用户。