홈>
다음 코드는
[NSURLConnection sendAsynchronousRequest:queue:completionHandler]
를 더 잘 이해하기위한 시도입니다.
.
와이즈 비즈가있다
NSLog
의 진술
차단하지만
completionHandler
에서 이것을 실행할 때
명령 행 프로젝트의 XCode에서는
main.m
를 입력하지 않습니다.
블록. 다른 큐를 사용해 보았습니다.
completionHandler
그리고
mainQueue
그러나 둘 다 작동하지 않습니다.
직감은 요청이 완료되기 전에 대기열이 할당 해제되고 유지주기가 포함된다는 것입니다.
currentQueue
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSCache *myCache = [[NSCache alloc] init];
NSArray *images = @[
@"http://i.stack.imgur.com/E66qr.png",
@"http://www.tiempoyquimera.com/wp-content/uploads/2010/01/Euro-Trash-Girl-2010.jpg",
@"http://1.bp.blogspot.com/-Mxd8AB2nbQY/UYCISJiQz3I/AAAAAAAAAH8/Tc43U8aa9dM/s1600/Tarantino10colhans_1460858i.jpg",
@"https://awestruckwanderer.files.wordpress.com/2014/02/alan-watts.png",
@"http://www.esalen.org/sites/default/files/photo_images/20120201_DELLIS__MG_9612_711.jpg"];
for (NSString *image in images){
NSURL *myURL = [NSURL URLWithString:image];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:myURL];
NSLog(@"Can handle request %@", @([NSURLConnection canHandleRequest:request]));
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSLog(@"In the completion handler");
if (!error)
{
// save data to cache with url as key
NSLog(@"Image Added to Cache");
[myCache setObject:data
forKey:myURL];
} else
{
NSLog(@"Image Not Added to Cache");
}
}];
}
}
return 0;
}
- 답변 # 1
관련 자료
- javascript - API 요청을 만들기 위해 비동기 작업이있는 useReducer
- c# - 비동기 대기 메소드는 대기 지점에서 UI를 차단합니다
- django - 수정 방법 - google chrome 용 corb 블록 (axios 요청)
- api - 자바 스크립트에서 비동기 GET 요청을 기다리는 중
- javascript - redux-saga를 사용한 비동기 요청
- ios - 비동기 요청을 호출하는 함수에 대한 단위 테스트 작성 및 아무것도 리턴하지 않음
- reactjs - get 요청과 루프 동기화를 수행하는 방법 - 비동기식 redux
- gulp - "비동기 완료를 알리는 것을 잊었습니까?"
- javascript - 두 개의 Arraymaps 내부의 비동기 요청
- c# - restsharp는 다중 비동기 요청을합니다
- c++ - 모덜리스 대화 상자에서 ESC 차단 및 Enter 키 (Win32, 비 MFC)
- angular - 방법 - 비동기 파이프를 사용할 때 http 요청을 다시 보내기
- 루프 내부의 Python 비동기 요청 호출
- linux - mod_rewrite로 특정 HTTP 요청을 차단하는 방법은 무엇입니까?
- javascript - 비동기 게시 요청을 보낼 수 없습니다
- java - Spring의 모든 요청에 대해 @Async 메소드에 지연을 추가하는 방법
- node.js - 반복되지 않을 때까지 비 동기화 (비동기 301)
- express - CORS 블록 전용 localhost 요청
- node.js - Got, Nock&Chai를 사용하여 Node에서 기본 비동기 http 요청 테스트
- scala - 메인 스레드를 차단하지 않지만 실패 할 경우 메인 스레드에서 예외를 발생시키는 비동기 IO 작업을 어떻게 실행할 수 있습니까?
관련 질문
- ios : 밖에서 도청 할 때보기를 제거하십시오
- ios : 상태 표시 줄을 두드릴 때 자동 점프 -to-to-Top 스크롤을 비활성화 /편집 할 수 있습니까?
- ios : 길게 누를 때 이미지가있는 uibutton에서 앱이 충돌합니다.
- iOS SDK 모범 사례 /최상의 아키텍처를 처음부터 구축 하시겠습니까? 기존 프로젝트를 사용하여 SDK로 래핑 할 기능 가져 오기
- ios : Airpods pro /max에서 자동 감지 정보 얻기
- ios : Objective-c와 함께 RealityKit 사용
- ios : 러시아어 문자로 문자열 구문 분석 문제
- UIImagePickerController로 만든 비디오의 파일 크기를 어떻게 줄일 수 있습니까?
- ios : TestFlight는 Testflight SDK로 빌드를 허용하지 않습니다
- ios : Swift에서 Facebook 메신저 SDK를 사용하여
와이즈 비즈
잘 모르겠습니다. 유지주기는 포함되지 않습니다. 끈기가 관련되어 있습니다. 당신은
에서 이것을하고 있습니다 기능.즉시종료합니다-비동기적인 것들 (네트워킹과 그에 따른 콜백)은 비동기 적이므로, 나중에if지속성을 가지게됩니다. 그러나 우리는 그렇지 않습니다. 와이즈 비즈 종료됩니다. 즉, 네트워킹을 수행 할 수있는 기회가 있기 전에완전한 프로그램이kaboom으로 종료됨을 의미합니다. 네트워킹.이제 실제 상황에서 일어나는 일과 대조 해보자. 실제 iOS 앱에서
이 코드에서main
main
를 호출하기 때문에 종료하지않습니다. 앱이 종료 될 때까지 반복됩니다.UIApplicationMain
중단되거나 종료 될 때까지 계속 실행됩니다. 한편, 클래스와 인스턴스는 생겨나 고 지속됩니다.int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
멈추지 않습니다. 예를 들면 다음과 같습니다.이제 어떤 의미에서는 정확히 같은 일이 일어납니다 :
UIApplicationMain
즉시 종료됩니다. 그러나 우리의 프로그램은 여전히 운영 중입니다! 와이즈 비즈 실행 루프가 있고 해당 실행 루프가 여전히 순환 중입니다. 따라서 상황이 지속되고 이제 비동기식 자료가 발생할 수 있습니다. 네트워크를 연결 한 다음 콜백을 호출 할 수 있습니다.@implementation MyViewController - (void) someMethod { // ... [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { // ... } } @end