3

我正在使用一些下载数据的代码。该代码使用块作为回调。有几种下载方法的代码非常相似: 在回调块中,UIAlertView如果出现问题,它们会显示。警报视图始终如下所示:

[req performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    if(error) {
        dispatch_async(dispatch_get_main_queue(), ^{

            [[NSNotificationCenter defaultCenter] postNotificationName:kFailed object:nil];
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                         message:@"Connection failed"
                                                        delegate:nil
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles:nil];
            [alertView show];
        });
    }
}];

我想将警报视图代码移动到它自己的方法中,因为它使用相同的参数多次调用。我应该也将 移至dispatch_async()该方法,还是应该将对该方法的调用包装在 中dispatch_async()

4

2 回答 2

0

无论哪种方式,你都可以做到。这两个代码块在功能上是相同的:

方法一

//.... Assuming this is called in a block
dispatch_async(dispatch_get_main_queue(), ^{
    [self showMyAlertView];
});

- (void) showMyAlertView {
    // Show the alert view and other stuff
}

方法二

//.... Assuming this is also called in your block
[self showMyAlertView];

- (void) showMyAlertView {
    dispatch_async(dispatch_get_main_queue(), ^{
        // Show the alert view and other stuff
    });
}

显然第二种方法需要最少的代码行,但是如果您想异步执行其他操作(除了显示警报视图),您可能需要执行方法 1,以便可以将其他内容添加到队列中。

希望这有帮助!

于 2013-05-08T20:31:40.597 回答
0

这与错误或正确无关。

优点:如果将 dispatch_async() 放在方法中,则可以从程序的每个位置发送消息,而不管您正在运行的线程是什么。

缺点:如果将 dispatch_async() 放在方法中,即使消息是从主线程发送的,代码也总是异步执行。(在这种情况下 dispatch_async() 根本就没有必要并且 dispatch_sync() 会死锁。)

反之亦然。

对我来说,不同的东西更重要:定义一层“调度方法”。仅在此层内使用 dispatch_async() 和 dispatch_sync() ,而不是在构建在此之上的层中,而不是在构建在此之下的层中。

从更高级别的软件始终使用这一层。在层内仅使用较低层上的方法。

于 2013-05-08T21:03:14.777 回答