.h
@property (strong) NSString *reply;
我有以下方法:NSURL連接sendAsynchronousRequest如何保存響應?
.m
@synthesize reply;
- (void)send
{
[NSURLConnection sendAsynchronousRequest:[self request]
queue:[[NSOperationQueue alloc] init]
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
if (error)
{
//NSLog(@"Error,%@", [error localizedDescription]);
[self setReply: [[NSString alloc] initWithString:[error localizedDescription]]];
}
else
{
//NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
[self setReply: [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]];
}
}];
}
現在,我試圖從塊/處理程序返回一個值,但顯然這是不可能的(或者我還沒有想出的語法還)。
我試圖設置一個局部變量來獲得答覆(數據)的值,但它會產生錯誤。
錯誤沒有產生的唯一方法是使用類屬性。但是當我試圖讀取[自我回復]的價值時,它是空的,這使我認爲它從未設置。
據我所知,sendAsync函數是線程和異步的,所以是[自我答覆]的值爲空的原因,而當我使用sendSynchronousRequest,我總是得到答覆?
我做錯了什麼,以及如何從completionHandler內返回一個值?
編輯#1:在我看來,我做的事情非常錯誤。我正在追蹤代碼,當我使用同步發送時,一切正常。使用異步方式,對於sendAsynchronousRequest的實際調用從未執行,這讓我認爲該線程沒有被調用,因此它是空值。
編輯#2:我已經找到解決的辦法,通過增加以下內容:
[NSURLConnection sendAsynchronousRequest:[self request]
queue:[NSOperationQueue alloc] init
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
if (error)
{
//NSLog(@"Error,%@", [error localizedDescription]);
[self setReply: [[NSString alloc] initWithString:[error localizedDescription]]];
}
else
{
//NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
[self setReply: [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]];
}
}];
[[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 2]];
不過,我不能完全肯定我理解它是如何工作的。我想象RunLoop會告訴異步操作運行2秒(我可以驗證,因爲在將日期間隔設置爲較低值時,由於使用活動服務器進行測試,我得到空響應)。我不明白的是,當我告訴RunLoop運行時,它永遠阻止一切,就好像當前線程永不終止一樣。
我不明白的問題/問題。爲什麼不能從塊完成功能返回一個值? setReply函數有什麼作用?向我們顯示代碼 – Lefteris 2012-04-24 15:10:21
設置斷點以查看數據是否有效或爲空。 你在正確的軌道上,這似乎有效,但你可能沒有得到可以使用的信息。 – 2012-04-24 15:28:21
該塊被指定爲具有void返回類型,所以塊本身不能返回值 - 但爲什麼需要返回值?我猜你的setReply函數只是一個實例變量的setter?在這種情況下,您不需要從塊中返回任何內容,因爲當您設置回覆時將會捕獲響應。使用本地變量捕獲數據值時產生的錯誤是什麼?你應該能夠設置一個斷點來查看數據。另外,我會添加檢查您收到的響應代碼。 – tronbabylove 2012-04-24 15:29:06