异步请求运行缓慢 - iOS

时间:2015-06-17 06:43:56

标签: ios objective-c cocoa-touch asynchronous nsoperationqueue

我有一个从服务器下载一组照片的应用程序。我正在使用异步请求,因为我不希望阻止UI。但是,我发现请求非常慢,需要很长时间才能加载。

我知道您可以将队列类型设置为for pixel in pixels: if sum(pixel) / len(pixel) < black_thresh: nblack += 1 ,但这只会将异步请求放回主线程上,从而首先使异步请求失败。

无论如何都要加快请求速度或告诉iOS:“在后台运行此请求,但请尽快完成,不要将其留到队列末尾”???

这是我的代码:

[NSOperationQueue mainQueue]

谢谢你的时间,Dan。

3 个答案:

答案 0 :(得分:2)

我认为您的问题不是请求运行缓慢,而是您正在更新不在主线程上的UI元素,包围任何UI更新(如在标签上设置文本)

dispatch_sync(dispatch_get_main_queue(), ^{
        <#code#>
});

答案 1 :(得分:0)

正如Fonix所说,它不是iOS响应缓慢但dataWithContentsOfURL在后台线程中不起作用。 Apple的建议是你应该与代表异步使用NSURLConnection - didReceiveResponse - didReceiveData

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:_mAuthenticationTimeoutInterval];

在这些方法中,您也可以使用数据块。

如果您确实希望这些多次下载更快,则应使用NSOperationQueue进行并行下载。您可以参考enter link description here

答案 2 :(得分:0)

我认为一个好的解决方案可能是在与NSOperation结合使用AFNetworking时,请检查我编写的代码以异步方式执行多个操作

NSMutableArray *operations = [[NSMutableArray alloc] init];
for(NSObject *obj in caches) {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:url];        
//...set up your mutable request options here

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];
    operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
    [operation  setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSInteger statusCode = operation.response.statusCode;
        if(statusCode==200) {
        }

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"API Call error:%@", error.localizedDescription);
    }];

    [[requestManager operationQueue] addOperation:operation];
    [operations addObject:operation];

    if([operations count] >= MAX_API_CALL) break;
}

[AFHTTPRequestOperation batchOfRequestOperations:operations progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
} completionBlock:^(NSArray *operations) {

    NSError *error;
    for (AFHTTPRequestOperation *op in operations) {
        if (op.isCancelled){
        }
        if (op.responseObject){
            // process your responce here
        }
        if (op.error){
            error = op.error;
        }
    }
}];