2012-04-03 12 views
2

Wie Änderung int-Wert in Block, ich habe dies:Wie kann man den int-Wert im Block ändern?

__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

wofür ist das extra lang? – Ali

+2

Wenn dies Ihr realer Code ist, besteht das Problem darin, dass der Block zu diesem Zeitpunkt nicht gerade ausgeführt wird. Wo genau befindet sich der zweite 'NSLog' in Ihrem Code? Sehen Sie tatsächlich "benötigte Größe" im Protokoll vor "out block Wert", oder sind sie umgekehrt? –

+0

Eine Sekunde .. ich werde es bald aktualisieren! –

Antwort

7

Das Problem ist, dass Sie das Absperren sind das Senden irgendwann später ausgeführt werden, nachdem die assetForURL:... Methode seine Arbeit getan hat, was es tut asynchron. Es ist höchstwahrscheinlich in einem Hintergrundthread oder einer Hintergrundwarteschlange, dass die Methode selbst sofort zurückkehren kann, während die Arbeit fortgesetzt wird.

So ist die Methode assetForURL:...kehrt vor Ihre resultBlock ausgeführt wurde, hat den Wert Bedeutung noch nicht geändert worden ist, durch die Zeit, die Sie in die zweite NSLog bekommen. Alles funktioniert gut; Sie überprüfen den Wert nur zu früh.

+0

thx zur Erläuterung^_ ^ –

Verwandte Themen