Grand Central Dispatch的互联网请求的良好模式?

non*_*ive 12 cocoa objective-c asihttprequest grand-central-dispatch

我目前正在使用带有GCD队列的同步ASIHTTPRequest从Internet下载数据,然后使用JSONKit解析响应数据.您如何看待这种模式?先感谢您.

这是我的代码:

    dispatch_async(queue, ^(void) {

        // Request is ASIHTTPRequest.
        [request startSynchronous];

        // Parse JSON.
        NSArray *array = [[request responseData] objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode];

        // Callback on the main queue to update UI.
        dispatch_async(dispatch_get_main_queue(), ^(void) {
            callbackBlock(array);
        });
    });
Run Code Online (Sandbox Code Playgroud)

编辑:我使用ASIHTTPRequest的原因是我需要修改OAuth的请求标头并使用POST方法上传图像.

hoo*_*oop 12

所以你替换了这个

- (void)doDownload {
    NSURL *url = [NSURL URLWithString:@"http://foobar.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    connection = [[NSURLConnection alloc] initWithRequest:aURLRequest delegate:self];
    receivedData = [[NSMutableData data] retain];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_receivedData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSArray *array = [_receivedData objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode];
    callbackBlock(array);       
}
Run Code Online (Sandbox Code Playgroud)

有了这个 -

- (void)doDownload {
    NSURL *url = [NSURL URLWithString:@"http://foobar.com"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^(void) {
        [request startSynchronous];
        NSArray *array = [[request responseData] objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode];

        // Callback on the main queue to update UI.
        dispatch_async(dispatch_get_main_queue(), ^(void) {
            callbackBlock(array);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

从ASIHTTPRequest 10,000+行代码.

它带给你什么?

NSURLConnection完全异步,使用GCD,缓存,自动压缩/解压缩等.

出于这个原因,并且完全依赖于您提供的(可能不完整的)信息,我会说这是一段非常糟糕的代码.

当然,上下文就是一切 - 你可能有一个非常非常非常好的理由来重新实现Apple提供的已有的Library代码功能.

  • 你的答案是非常有效的,但也许有点沉重的讽刺...... (6认同)