使stringWithContentsOfURL异步 - 它安全吗?

Jon*_*asG 6 asynchronous objective-c thread-safety ios http-request

我试图通过从后台线程同步运行它来使[NSString stringWithContentsOfURL:encoding:error:]异步:

__block NSString *result;
dispatch_queue_t currentQueue = dispatch_get_current_queue();

void (^doneBlock)(void) = ^{
    printf("done! %s",[result UTF8String]);
};

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                         (unsigned long)NULL), ^(void) {
    result = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com/"] encoding:NSUTF8StringEncoding error:nil];
    dispatch_sync(currentQueue, ^{
        doneBlock();
    });
});
Run Code Online (Sandbox Code Playgroud)

它的工作正常,最重要的是,它的异步.

我的问题是这样做是否安全,或者是否存在任何线程问题等?

提前致谢 :)

Ans*_*ala 27

这应该是安全的,但为什么重新发明轮子?

NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    // etc
}];
Run Code Online (Sandbox Code Playgroud)