2012-04-03 6 views
2

변경 int 값은 블록에서, 나는이 방법이 :블록에서 int 값을 변경하는 방법은 무엇입니까?

__block long long size = -1; 
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) 
{ 

    ALAssetRepresentation * rep = [myasset defaultRepresentation]; 
    size = [rep size]; 
    //here showed normal value 
    NSLog(@"needed size : %lld",size); 
}; 
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; 
[assetslibrary assetForURL:self.tmpVideoURL 
       resultBlock:resultblock 
       failureBlock:nil]; 

//but here remaind -1 
NSLog(@"out block value : %lld",size); 
+0

무엇이 길어? – Ali

+2

이것이 실제 코드라면 문제는 블록이 정의 된 바로 그 지점에서 실행되고 있지 않다는 것입니다. 정확히 두 번째'NSLog'가 코드에 있습니까? 실제로 "필요한 크기"가 "블록 값 초과"이전에 로그에 표시되는 것을 보 고 있습니까? 아니면 그 반대입니까? –

+0

1 초 .. 곧 업데이트하겠습니다! –

답변

7

문제는 assetForURL:... 방법이 을하고있어 그 작업을 수행 한 후, 그 언젠가 나중에 실행되도록 차단할 보내는 것입니다 비동기식으로. 백그라운드 스레드 또는 대기열에있을 가능성이 높기 때문에 작업이 계속 진행되는 동안 메서드 자체가 즉시 반환 될 수 있습니다.

그래서 값을 의미하여 resultBlock가 실행 전에 반환 assetForURL:... 방법은 두 번째 NSLog에 도착하는 시간에 의해, 아직 변경되지 않았습니다. 모든 것이 잘 작동합니다. 당신은 너무 일찍 값을 확인하고 있습니다.

+0

설명을위한 thx^_ ^ –

관련 문제