2012-10-30 3 views
0

다음 코드가 있는데 작동하지 않습니다. 그 뒤에 뭔가있는 것이 있습니까?NSOperation 및 NSOperationQueue가 작동하지 않습니다.

[operationQueue addOperationWithBlock:^{ 
     imageData = [NSData dataWithContentsOfURL:imageURL]; 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      UIImage *image = nil; 

      if(imageData){ 
       UIImage *image = [UIImage imageWithData:imageData]; 
       cell.imageView.image = image; 
      } 
     }]; 
    }]; 

심지어 NSOperation의 하위 클래스를 만든 다음 init을 할당해도 생각했던대로 작동하지 않습니다. 나는 항상 NSOperation 서브 클래스를 시작하기 위해 호출해야하지만 NSOperation에 시작 메시지를 보내면 백그라운드 스레드에서 실행되는 것이 아니라 메인 스레드에서 실행된다고 가정합니다.

+3

출력은 무엇입니까? 도움이 필요하면 어떤 오류가 발생했는지 알려주십시오. 우리는 마음을 읽는 독자가 아닙니다. – Steven

+0

'imageData = [NSData dataWithContentsOfURL : imageURL]; 및'UIImage * image = nil;'줄에 중단 점을 넣으려고 했습니까? 이것을 알면 프로그램이 두 개의 다른 NSOperationQueue에 추가 한 블록을 실행하는지 여부를 알 수 있습니다. 'UIImage * image = nil;'에서 휴식을 취한다면,'[imageData length]'를 출력하십시오. –

+0

이 방법으로는 작동하지 않습니다.이 방법으로 이미지를로드 할 수 없습니다. 나는 빈 응답을 가지고 있으며 이미지를 다운로드하기위한 블록이 전혀 호출되지 않은 것 같습니다. – Sandeep

답변

1
내가 GCD를 사용하여 대체 솔루션에 추가 할

:

backgroundQueue = dispatch_queue_create("com.razeware.imagegrabber.bgqueue", NULL); 
dispatch_async(backgroundQueue, ^{ 
          /* put the codes which makes UI unresponsive like reading from network*/ 
         imageData = [NSData dataWithContentsOfURL:imageURL]; 
         ..... ; 
         dispatch_async(dispatch_get_main_queue(),^{ 
             /* do the UI related work on main thread */ 
             UIImage *image = [UIImage imageWithData:imageData]; 
             cell.imageView.image = image; 
             ......; }); 
            }); 
dispatch_release(backgroundQueue); 

날이 하나가 당신을 도와 여부를 알려 주시기를)

Reference

+0

어떤 구현이 더 깨끗하게 보이는지 결정하기가 어렵습니다. 나는 둘 다 좋아한다. 이 문제의 단점은 dispatch_release()를 기억해야한다는 것입니다. –

+0

글쎄, gcd는 항상 나에게 즐거워 보입니다. 적어도 지하에 무엇이 가는지 분명히 이해할 수 있습니다. NSOperationQueue 및 NSOperation을 사용하여 일부 기능을 테스트하려고했지만 거의 실패하지 않았습니다. – Sandeep

+0

그래, 나는 GCD 더 선호한다. –

관련 문제