我有两个问题。
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 ;
,在执行requestDone
或requestWentWrong
方法之前,它执行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知道用户登录是成功还是失败。
答案 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之前,您必须通知用户请求正在等待...例如放置UIActivityIndicator或禁用UI,...
当您收到回调时,请更新UI:隐藏活动指示器,重新启用UI ...或者如果请求失败,请通知用户。