2014-09-25 2 views
0

NSMutableArraySDWebImage과 함께 다운로드하여 나중에 표시하려고합니다.NSMutableArray가 for 루프 이후에 객체를 유지하지 않습니다.

내가 가지고있는 문제는 처음에는 배열이 완료 루프에 객체를 저장하지만 그 후에 객체가 손실된다는 것입니다.

배열은 viewDidLoad으로 초기화되며 속성은 .h로 선언됩니다.

SDWebImageManager *manager = [SDWebImageManager sharedManager]; 

    for (int i = 0; i<urlsArray.count; i++) 
    { 
     [manager downloadImageWithURL:[urlsArray objectAtIndex:i] options:SDWebImageDelayPlaceholder progress:nil 
      completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) 
      { 
       [self.photosArray addObject:image]; 
       //Here are stored into self.photosArray 
      }]; 
    } 
    //Here the photosArray is empty 

그러나보기를 다시 입력하면 개체가 나타납니다. 정말 이상해. 첫 번째 시도에서는 표시되지 않습니다.

나는 이미 여기와 Google에서 검색했지만 아무 것도 정말로 도움이되지 못했습니다.

+1

주문 순서가 잘못되었습니다. 완료 블록이 아직 실행되지 않았으므로 사진 배열이 비어 있습니다. – CrimsonChris

+0

오, 나는 photosArray를 for 루프 바깥에 비워 두려고했다. 내 잘못, 질문 편집 – Phillip

+0

비동기 코드를 위에서 아래로 읽을 수 없으며 순서대로 실행될 것으로 예상됩니다. 각 이미지가로드되는 데 오랜 시간이 걸릴 수 있으며 완료 블록은 완료 될 때만 실행됩니다. – CrimsonChris

답변

2

완료 블록은 메서드에서 작업이 완료 될 때만 실행됩니다. 메서드를 호출하면 프로그램은 배열이 여전히 비어있는 다음 줄로 계속 진행됩니다. 이 방법은이 시점에서 배경에있는 것입니다. 완료 블록은 나중에 시간에 실행됩니다.

채워진 배열을 받으려면 완료 블록 내에서 채워진 배열이 필요한 코드 조각을 호출해야합니다.

+1

어쨌든 for 루프를 알지 못했습니다. 이것은 상황을 다르게 만듭니다.완료 블록에서 다음을 수행하는 메소드를 호출하십시오. 정수를 1 씩 증가시킨 다음 원하는 수의 요소 (사용자의 경우 'urlsArray.count')와 같은지 확인하십시오. 그럴 경우 채워진 배열이 필요한 코드가있는 다른 메서드를 호출하십시오. for 루프의 모든 메소드 호출이 백그라운드에서 실행되고 실행 완료된 모든 호출이 언제인지 알 수 없기 때문에이 작업이 필요합니다. 이렇게하면 간단한 카운터 메소드가 배열에있는 요소 수를 추적하여 그에 따라 작동합니다. – adam10603

1

[manager downloadImageWith...]을 호출 한 후 completed 블록에 객체를 추가 했으므로 photosArray을 채우지 않아도됩니다. 이는 연결 완료시 비동기 적으로 발생합니다.

+0

문제는 실제로 그것을 채울 필요가 있지만 그것을 할 수 없다는 것입니다. – Phillip

+1

이미지를 배열에 잘 추가하고 있습니다. 문제는 비동기 코드가 동 기적으로 실행될 것으로 기대한다는 것입니다. – CrimsonChris