我有一个资产经理需要通知所有者它的资产已经准备好了。我正在发送一个令牌供消费者听,以听取通知,以避免更紧密的耦合。问题是当资产已经加载时我需要在延迟后调用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 :(得分:1)
使用NSObject的performSelector函数,允许在延迟后调用它。
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
你甚至可以使用这个函数的形式在另一个线程上运行它,这对于在进行冗长操作时不阻塞主线程很有用(只是不要弄乱这个线程中的UI对象)。
答案 1 :(得分: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;
}