2011-05-01 78 views
0

我有一個資產管理器,需要通知所有者它的資產已準備就緒。我向消費者發送令牌以聽取傾聽通知以避免更緊密的耦合。問題是當資產已經加載時,我需要在延遲後調用loadComplete。在objective-c中執行此操作的最佳方法是什麼?模擬異步函數調用

資產管理

-(tokenString*) loadAssetPath:(NSString*) asset { 
    //start asynchronous load 
    //or if assets ready send complete  <-- issue 
    return nonceToken; 
} 
-(void)loadComplete { 
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:tokenString object:self]; 
} 

消費者

NSString* token; 
-(void) loadSomething { 
    if(token) 
     [self removeListener]; 
    token = [[AssetManager sharedManager] 
     loadAssetPath:@"http://server.dev/myLargeImage.png"]; 
    [[NSNotificationCenter defaultCenter] 
     addObserver:[AssetManager sharedManager] 
     selector:@selector(assetLoaded:) name:token]; 
} 
-(void)assetLoader:(NSNotifcation*)aNotification { 
    [self removeListener]; 
    //continue on with stuffing stuff 
} 
+0

我剛剛發現'performSelector:withObject:afterDelay:'看起來應該可以工作。如果我調用'[self performSelector:@selector(loadingMethod :) withObject:asset afterDelay:0.3];'並且在資產已經下載時直接調用loadMethod loadComplete:tokenString。這看起來應該起作用。 – puppybits 2011-05-01 16:09:09

+0

0.3沒有必要。除非需要特定的時間(例如計時器),否則通常應該在這裏傳遞0。 – 2011-05-01 16:20:53

回答

1

使用的NSObject的performSelector功能,這使得它的延遲後調用。

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 

你甚至可以使用這個函數的形式到另一個線程,這是在做冗長的操作時,不會阻塞主線程有用運行(只是不與此線程的UI對象淤泥) 。

0

@DavidNeiss對於performSelector:withObject:afterDelay:是正確的,但你幾乎肯定不想在這裏實際發生時間延遲。最多你想在下一個事件循環中執行你的選擇器,這樣對於監聽器來說是一致的。所以你應該延遲0.這與正常的performSelect:withObject:不同,它會立即執行選擇器同步。

-(tokenString*) loadAssetPath:(NSString*) asset { 
    //start asynchronous load 
    if (<load is actually complete>) { 
     // -loadComplete will execute on the next event loop 
     [self performSelector:@selector(loadComplete) withObject:nil afterDelay:0]; 
    } 

    return nonceToken; 
}