异步使用IOS 4调用方法

Ton*_*ony 4 asynchronous ios4 ios

我想异步调用一个方法.这是一种从服务器获取HTML并将其设置为以下内容的方法UIWebView:

NSString *htmlTest = [BackendProxy getContent];
[webView loadHTMLString:htmlTest baseURL: nil];
[webView setUserInteractionEnabled:YES];
Run Code Online (Sandbox Code Playgroud)

我想UIWebView在数据获取期间启动一个活动指示器,所以我需要getContent异步调用.我怎样才能做到这一点?

cob*_*bal 14

这是Apple的新(ish)并发API GCD的一个很好的用例.

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^ {
    // Background work here
    NSLog(@"Finished work in background");
    dispatch_async(dispatch_get_main_queue(), ^ {
        NSLog(@"Back on main thread");
    });
});
Run Code Online (Sandbox Code Playgroud)

这是关于调度队列的文档

  • @Tony优点:更精细的控制,更清晰的代码(在我看来,我不喜欢有一种方法的逻辑如此分散.).缺点:在iOS 4之前不起作用. (2认同)

Kri*_*izz 8

我建议performSelectorInBackground:withObject:NSObject.

如下:

- (void)loadIntoWebView: (id) dummy
{

    NSString *html = [BackendProxy getContent];
   [self performSelectorOnMainThread: @selector(loadingFinished:) withObject: html];
}


- (void)loadingFinished: (NSString*) html
{
   // stop activity indicator
   [webView loadHTMLString:html baseURL: nil];
   [webView setUserInteractionEnabled:YES]; 
}

- (void) foo
{
   // ...
   // start activity indicator
   [self performSelectorInBackground: @selector(loadIntoWebView:) withObject: nil];
}
Run Code Online (Sandbox Code Playgroud)