Trên MacOS, chúng tôi có một đại lý thực hiện ARC và sẽ thực hiện một số yêu cầu tới máy chủ mỗi 10 hoặc 15 giây tùy thuộc vào cài đặt của người dùng và đang hoạt động mà không gặp bất kỳ sự cố nào cho gần một năm, và chỉ một vài tuần trước, ứng dụng bị rơi trong một máy tính với một lỗi truy cập Bad, đặc biệt trên dòng này:Lỗi ngẫu nhiên trên yêu cầu đồng bộ trên đại lý Mac OS X
[NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error];
các Mac OS X phiên bản của máy đó gây ra vấn đề là 10.7.5, tuy nhiên trong các máy tính khác có cùng phiên bản hệ điều hành vẫn hoạt động tốt.
Chúng tôi đang sử dụng yêu cầu đồng bộ vì đó là những gì chúng tôi cần thực hiện công việc , tuy nhiên chúng tôi đã dành thời gian thực hiện cuộc gọi không đồng bộ nhưng sự cố vẫn xảy ra.
Vì vậy, sau khi xem các bài đăng khác, chúng tôi đã thêm chính sách bộ nhớ cache: [yêu cầu setCachePolicy: NSURLRequestReloadIgnoringCacheData]; để tránh mọi sự cố với yêu cầu bộ nhớ cache. Ứng dụng hoạt động tốt hơn nhưng là vẫn gặp sự cố thường xuyên trong khoảng từ 1500 đến 1800 lần lặp lại (30-40 phút), trước khi bị rơi từ 15 đến 20 lần lặp.
Bằng cách xem xét các câu hỏi khác trong ngăn xếp tràn, chúng tôi đã khắc phục sự cố này bằng cách sử dụng ASIHTTPRequest nhưng lại gặp sự cố ngẫu nhiên (có thể gặp sự cố trong lần lặp # 2 hoặC# 123x ...).
Trước khi lỗi xuất hiện, yêu cầu luôn hoạt động bình thường, chúng tôi đang nhận dữ liệu và có thể hoạt động bình thường.
Với tùy chọn NSZombieEnabled kích hoạt chúng tôi không nhận được bất kỳ thông báo khi các ứng dụng bị treo, try/catch block không hoạt động cho chúng tôi hoặc kể từ khi lỗi được trỏ đến dòng cụ thể từ trên cao;
[NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error]
Đây là mã mà chúng ta phải thực hiện yêu cầu sử dụng NSURLConnection:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
init]; [request setHTTPMethod:@"GET"]; [request setURL:[NSURL
URLWithString:url]]; [request setTimeoutInterval: TIMEOUT];
[request setCachePolicy: NSURLRequestReloadIgnoringCacheData];
NSString *authenticationHeader = [NSString
stringWithFormat:@"Basic %@", credentials]; [request
addValue:authenticationHeader
forHTTPHeaderField:@"Authorization"];
NSError *error = nil; NSHTTPURLResponse *responseCode = nil;
NSData *responseData = nil; responseData = [NSURLConnection
sendSynchronousRequest:request returningResponse:&responseCode
error:&error];
if([responseCode statusCode] != 200){ *hasError =[NSString
stringWithFormat: @"Error getting %@, HTTP status code %li",
[responseCode statusCode]]; return @"";
}
}
return [[NSString alloc] initWithData:responseData
encoding:NSUTF8StringEncoding];
Và đây là mã cho ASIHttpRequest:
(NSString *)getDataFromURL: (NSString *)urlString withB64Credentials:(NSString *)credentials error:(NSString **)hasError
{
NSString *response = @"";
NSURL *url = [NSURL URLWithString:urlString];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setCachePolicy:ASIDoNotReadFromCacheCachePolicy];
[request setTimeOutSeconds:TIMEOUT];
NSString *authenticationHeader = [NSString stringWithFormat:@"Basic %@", credentials];
[request addRequestHeader:@"Authorization" value:authenticationHeader];
[request startSynchronous];
NSError *error = [request error];
if (!error)
response = [request responseString];
else
NSLog(@"%@", [error description]);
return response;
}
Bất kỳ đề nghị sẽ được đánh giá.
có thể trùng lặp với lỗi [NSURLConnection (sendSynchronousRequest) trên đại lý Mac OS X] (http: // stackoverflow.com/questions/18622363/nsurlconnection-sendynchronousrequest-crashing-on-mac-os-x-agent) – Wain
Bạn nên cập nhật câu hỏi của mình, không đăng lại cùng một câu hỏi. – Wain
Nhật ký nói gì? – uchuugaka