sendAsynchronousRequest:queue:completionHandler:
2부 질문
1부: 데이터베이스에 대한 비동기 요청을 작성하려고 합니다.저는 현재 동기식으로 하고 있지만, 저는 무슨 일이 일어나고 있는지 더 잘 이해할 수 있는 두 가지 방법을 배우고 싶습니다.
현재 저는 동기식 통화를 이렇게 설정했습니다.
- (IBAction)setRequestString:(NSString *)string
{
//Set database address
NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http://127.0.0.1:8778/instacodeData/"]; // imac development
//PHP file name is being set from the parent view
[databaseURL appendString:string];
//call ASIHTTP delegates (Used to connect to database)
NSURL *url = [NSURL URLWithString:databaseURL];
//SynchronousRequest to grab the data
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSError *error;
NSURLResponse *response;
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (!result) {
//Display error message here
NSLog(@"Error");
} else {
//TODO: set up stuff that needs to work on the data here.
NSString* newStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
NSLog(@"%@", newStr);
}
}
제가 해야 할 일은 전화를 교체하는 것입니다.
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
A 동기화 버전과 함께
sendAsynchronousRequest:queue:completionHandler:
그러나 대기열 또는 완료 핸들러에 무엇을 전달해야 할지 모르겠습니다.어떠한 사례/해결책도 매우 감사하겠습니다.
2부:멀티태스킹에 대한 내용을 읽고 있는데, 중단이 발생할 경우 연결 요청을 완료하여 지원하고 싶습니다.저는 이 예를 따르고 있습니다.
그 안에는 인터럽트가 발생했을 때 더 많은 시간을 얻는 방법이 설명되어 있습니다. 저는 그것이 무엇을 하는지 이해합니다.하지만 어떻게 이 연결에 적용하지 않습니까?적용하는 방법을 알아내는 데 도움이 되는 예/방법이 있다면 정말 멋질 것입니다!
1부:
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil)
[delegate receivedData:data];
else if ([data length] == 0 && error == nil)
[delegate emptyReply];
else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
[delegate timedOut];
else if (error != nil)
[delegate downloadError:error];
}];
다음은 샘플입니다.
NSString *urlAsString = @"http://www.cnn.com";
NSURL *url = [NSURL URLWithString:urlAsString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[NSURLConnection
sendAsynchronousRequest:urlRequest
queue:[[NSOperationQueue alloc] init]
completionHandler:^(NSURLResponse *response,
NSData *data,
NSError *error)
{
if ([data length] >0 && error == nil)
{
// DO YOUR WORK HERE
}
else if ([data length] == 0 && error == nil)
{
NSLog(@"Nothing was downloaded.");
}
else if (error != nil){
NSLog(@"Error = %@", error);
}
}];
대기열 매개 변수의 경우 다음 마법을 사용합니다.
[NSOperationQueue mainQueue]
메인 큐가 메인 스레드이기 때문에 요청 완료 시 UI를 업데이트하는 경우에는 매우 유용합니다.기본적으로 NSURL 연결의 이전 동작을 제공합니다.그러나 파일에 쓰거나 압축을 풀 계획이라면 백그라운드 대기열에서 완료한 다음 UI 업데이트를 위해 비동기를 다시 기본 대기열로 보낼 수 있습니다.
저도 비슷한 문제를 계속 연구하고 있는데, 이 질문을 올리고 여기서 명확한 답을 얻었는데, 2부에 도움이 되었으면 합니다.
파트 1의 경우 여기에 언급된 다른 사람들은 좋지만 다른 체크를 추가해야 합니다(아래 답변을 수정했습니다).요청 시 404 오류(페이지를 찾을 수 없음)가 반환될 수 있으며, 이 경우 오류 및 데이터는 0보다 클 수 있습니다.200은 좋은 반응입니다. 상태 코드 404 또는 무엇이든 확인할 수 있습니다.
[NSURLConnection
sendAsynchronousRequest:urlRequest
queue:[[NSOperationQueue alloc] init]
completionHandler:^(NSURLResponse *response,
NSData *data,
NSError *error)
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if ([data length] >0 && error == nil && [httpResponse statusCode] == 200)
{
// DO YOUR WORK HERE
}
부터sendAsynchronousRequest:urlRequest queue:queue completionHandler:
iOS 9에서는 더 이상 사용되지 않으며 대신 를 사용할 것을 제안합니다.iOS 7 이상부터 사용할 수 있습니다.
원본:
NSURL *URL = [NSURL URLWithString:@"http://example.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
// ...
}];
NSURL 세션별:
NSURL *URL = [NSURL URLWithString:@"http://example.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
// ...
}];
[task resume];
sendAsynchronousRequest
스위프트에서 더 이상 사용되지 않습니다.다음으로 이동dataTaskWithRequest
다행히도 그것은 거의 같은 방식으로 사용됩니다.
if let url = NSURL(string:"http://your_url") {
let request:NSURLRequest = NSURLRequest(URL: url)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)
let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
});
task.resume()
}
언급URL : https://stackoverflow.com/questions/9270447/how-to-use-sendasynchronousrequestqueuecompletionhandler
'programing' 카테고리의 다른 글
Maria 백업 중에 mysqld 오류가 발생하는 이유 (0) | 2023.08.24 |
---|---|
자리 표시자 텍스트 변경 (0) | 2023.08.19 |
HTML 가로 스크롤 막대는 숨기지만 세로 스크롤 막대는 숨기기 (0) | 2023.08.19 |
입력 텍스트 대화 상자 Android (0) | 2023.08.19 |
Oracle에서 편집 가능한 보기 적용 (0) | 2023.08.19 |