【问题标题】:How to upload big image asynchronously with NSURLConnection?如何使用 NSURLConnection 异步上传大图?
【发布时间】:2011-05-13 17:27:20
【问题描述】:

现在,我正在尝试使用 FBConnect 将照片图像上传到 Facebook。 我成功地从主线程上传图像,但是它阻塞了用户界面很长时间。

所以,我尝试使用 dispatch_async 来解决阻塞问题。使用 dispatch queue 可以解决 UI 阻塞问题,但是上传照片数据就不行了。

NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                               img, @"picture",
                               nil];
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

[params retain];
dispatch_async(aQueue, ^{        
    [facebook requestWithMethodName:@"photos.upload"
                          andParams:params
                      andHttpMethod:@"POST"
                        andDelegate:self];
    [params release];
    dispatch_async(aQueue, ^{ [uploadingIndicator stopAnimating]; });
});

我认为这个问题与 NSURLConnection 有关。 FBConnect 使用 NSURLConnection 将图像数据发布到 facebook。如果我从调度队列调用 FBConnect API,在调度队列线程中调用的 NSURLConnection 方法可能没有运行循环。

_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

我尝试使用 scheduleInRunLoop。但是,没用。

_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[_connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

我该如何解决这个问题?有什么建议吗?

BR, 元一。

【问题讨论】:

  • 今天遇到了同样的问题,FBRequest 的 NSURLConnection 在后台线程中运行时不会调用委托方法。 (没有使用块)。这是一个没有答案的类似问题:stackoverflow.com/questions/4626273/…
  • 最终使用了 ASIHTTPRequest,它在后台线程中运行良好。解决方案可能是微不足道的。学习会很有趣。

标签: iphone ios facebook nsurlconnection grand-central-dispatch


【解决方案1】:

问题可能是您在后台线程中运行了多个 UIKit 方法。与 UIKit 的所有交互都必须在处理所有用户输入的主线程中完成。

我不熟悉您使用的 Facebook API 方法,但它似乎与 UIImage 一起使用。如果你可以让它与支持的 CGImage 一起工作,或者使用不与任何 UIKit 对象交互的不同方法,你可能会解决问题。 (同样,我无法帮助您,因为我没有使用任何 Facebook API。)另外,您需要从主线程调用 UIActivityIndicatorView 方法 stopAnimating

你可以像这样设置队列:

dispatch_queue_t myQueue = dispatch_queue_create("anyName", NULL);

dispatch_async(myQueue, ^{   
    // upload image to Facebook, but without using UIKit methods

    dispatch_async(dispatch_get_main_queue(), ^{ 
        [uploadingIndicator stopAnimating]; 
    });
});
dispatch_release(myQueue);

这样,您可以在后台线程中完成繁重的工作,然后返回主线程调用任何 UIKit 方法。

更正:UIImage 以及 UIColor 和 UIFont 都是 UIKit 对象的例外,它们可以在主线程之外安全地进行交互。 UIKit 的其余大部分都不是线程安全的,当然包括 UIImageView。 (我倾向于在深夜混淆 UIImage 和 UIImageView。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2013-08-29
    相关资源
    最近更新 更多