Iphone 如何使用NSURLConnection异步上传大图像?
现在,我正在尝试使用将照片图像上传到Facebook。 我成功地从主线程上传了图像,但它阻塞了用户界面相当长的时间 所以,我尝试使用dispatch\u async来解决阻塞问题。通过使用调度队列,可以解决UI阻塞问题,但照片数据上传不再有效Iphone 如何使用NSURLConnection异步上传大图像?,iphone,ios,facebook,nsurlconnection,grand-central-dispatch,Iphone,Ios,Facebook,Nsurlconnection,Grand Central Dispatch,现在,我正在尝试使用将照片图像上传到Facebook。 我成功地从主线程上传了图像,但它阻塞了用户界面相当长的时间 所以,我尝试使用dispatch\u async来解决阻塞问题。通过使用调度队列,可以解决UI阻塞问题,但照片数据上传不再有效 NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: img, @"picture",
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]; });
});
我认为这个问题与网络连接有关。FBConnect使用NSURLConnection将图像数据发布到facebook。若我从调度队列调用FBConnect API,那个么在调度队列线程中调用的NSURLConnection方法可能并没有运行循环
_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
我尝试使用ScheduleUnlop。但是,没用
_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[_connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
我如何解决这个问题?有什么建议吗
比尔,
Wonil.问题可能是您正在后台线程中运行多个UIKit方法。与UIKit的所有交互必须在主线程中完成,主线程处理所有用户输入 我不熟悉您使用的Facebook API方法,但它似乎与UIImage一起工作。如果您可以让它与备份CGImage一起工作,或者使用不与任何UIKit对象交互的其他方法,则可以解决此问题。(同样,我无法帮助您,因为我没有使用任何Facebook API。)此外,您需要从主线程调用
UIActivityIndicatorView
方法stop animating
您可以这样设置队列:
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。)问题可能是您在后台线程中运行了几个UIKit方法。与UIKit的所有交互必须在主线程中完成,主线程处理所有用户输入 我不熟悉您使用的Facebook API方法,但它似乎与UIImage一起工作。如果您可以让它与备份CGImage一起工作,或者使用不与任何UIKit对象交互的其他方法,则可以解决此问题。(同样,我无法帮助您,因为我没有使用任何Facebook API。)此外,您需要从主线程调用
UIActivityIndicatorView
方法stop animating
您可以这样设置队列:
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。)今天也有同样的问题,FBRequest的NSURLConnection在后台线程中运行时不会调用委托方法。(没有使用块)。这里有一个没有答案的类似问题:最终使用了AsiTpRequest,它在后台线程中运行良好。不过,解决方案可能微不足道。学习起来会很有意思。今天有同样的问题,FBRequest的NSURLConnection在后台线程中运行时不会调用委托方法。(没有使用块)。这里有一个没有答案的类似问题:最终使用了AsiTpRequest,它在后台线程中运行良好。不过,解决方案可能微不足道。我很想知道。