>

다음 코드는 [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

    와이즈 비즈

    잘 모르겠습니다. 유지주기는 포함되지 않습니다. 끈기가 관련되어 있습니다. 당신은

    My hunch is that the queue is being deallocated before the request is completed and that retain cycles are involved

    에서 이것을하고 있습니다  기능.즉시종료합니다-비동기적인 것들 (네트워킹과 그에 따른 콜백)은 비동기 적이므로, 나중에if지속성을 가지게됩니다. 그러나 우리는 그렇지 않습니다. 와이즈 비즈  종료됩니다. 즉, 네트워킹을 수행 할 수있는 기회가 있기 전에완전한 프로그램kaboom으로 종료됨을 의미합니다. 네트워킹.

    이제 실제 상황에서 일어나는 일과 대조 해보자. 실제 iOS 앱에서 main   main 를 호출하기 때문에 종료하지않습니다. 앱이 종료 될 때까지 반복됩니다.

    main
    
    
    이 코드에서 UIApplicationMain  중단되거나 종료 될 때까지 계속 실행됩니다. 한편, 클래스와 인스턴스는 생겨나 고 지속됩니다. int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }  멈추지 않습니다. 예를 들면 다음과 같습니다.

    UIApplicationMain
    
    

    이제 어떤 의미에서는 정확히 같은 일이 일어납니다 : UIApplicationMain  즉시 종료됩니다. 그러나 우리의 프로그램은 여전히 ​​운영 중입니다! 와이즈 비즈  실행 루프가 있고 해당 실행 루프가 여전히 순환 중입니다. 따라서 상황이 지속되고 이제 비동기식 자료가 발생할 수 있습니다. 네트워크를 연결 한 다음 콜백을 호출 할 수 있습니다.

    @implementation MyViewController - (void) someMethod { // ... [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { // ... } } @end

  • 이전 web - 인터넷이 없어도 링크에 이미지가 표시됩니다
  • 다음 mysql - 내 SQL 코드의 결함은 어디에 있습니까?