模拟异步函数调用

时间:2011-05-01 15:59:46

标签: iphone objective-c

我有一个资产经理需要通知所有者它的资产已经准备好了。我正在发送一个令牌供消费者听,以听取通知,以避免更紧密的耦合。问题是当资产已经加载时我需要在延迟后调用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
}

2 个答案:

答案 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;
}