[英]ASIHTTPRequest causes app freeze in iPhone5s
我正在使用ASITHTTPREQUEST進行Web服務調用。 現在應用程序在iPhone5s設備(iOS7.1)中凍結。 應用程序在客戶端設備中凍結,因此我無法找出確切的問題。 請注意,該應用程序根本不會崩潰。
碼:
if ( ![self connected]){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"No internet connection." delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
[alert show];
return;
}
// register
NSString *registerAPI = @"http://letsnurture.co.uk/demo/q&a/web-services/user-register.php";
NSURL *url = [NSURL URLWithString:registerAPI];
__weak ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:self.edFirstname.text forKey:@"firstname"];
[request setPostValue:self.edLastname.text forKey:@"lastname"];
[request setPostValue:self.edEmail.text forKey:@"email"];
[request setPostValue:self.edPassword1.text forKey:@"password"];
[request setPostValue:@"null" forKey:@"deviceid"];
[request setPostValue:@"true" forKey:@"check"];
[request setTimeOutSeconds:10];
[request setCompletionBlock:^{
// Use when fetching text data
NSString *responseString = [request responseString];
NSLog(@"Reponse : %@",responseString);
// Use when fetching binary data
NSData *responseData = [request responseData];
NSError *e;
NSDictionary *JSON =
[NSJSONSerialization JSONObjectWithData: responseData
options: NSJSONReadingMutableContainers
error: &e];
int status = [[JSON valueForKey:@"status"] intValue];
if (status == 1) {
// success from server
}else{
// failed on server. show message from server in alert
NSDictionary *user = [JSON valueForKey:@"User"];
NSString *message = [user valueForKey:@"message"];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil ];
[alert show];
}
}];
[request setFailedBlock:^{
[[[UIAlertView alloc]initWithTitle:@"Error" message:@"Can not connect to the internet." delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil] show];
NSError *error = [request error];
NSLog(@"Error : %@",error);
}];
[request startAsynchronous];
編輯如何使用默認的URL連接(使用block)發布數據。
- (BOOL)connected
{
Reachability *hostReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [hostReachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}
請刪除ASIFormDataRequest上的weak
限定詞。 命名意味着這應該不成問題,但是在某些情況下,請求會立即被釋放並為空。 如果唯一的UI更新在完成塊中發生,則可能會掛起。
至少,該弱限定符是不必要的。
如果ASIFormDataRequest保留了該塊(不應該這樣做,因為如果他們告訴您將其用於responseData,那么它會鼓勵一個保留周期),則可以保留一個普通的指針,但是可以這樣繞過該周期:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
__weak ASIFormDataRequest *weakRequest = request;
// replace all references to 'request' inside the block with 'weakRequest'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.