Как загрузить большое изображение асинхронно с NSURLConnection? - PullRequest
1 голос
/ 13 мая 2011

Теперь я пытаюсь загрузить фотоизображение в Facebook, используя FBConnect .Мне удалось загрузить изображение из основного потока, но он довольно долго блокирует пользовательский интерфейс.

Итак, я попытался использовать dispatch_async для решения проблемы блокировки.Используя очередь отправки, проблема блокировки пользовательского интерфейса может быть решена, но загрузка данных с фотографиями больше не работает.

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, Wonil.

1 Ответ

1 голос
/ 14 мая 2011

Возможно, проблема в том, что вы запускаете несколько методов UIKit в фоновом потоке.Все взаимодействие с UIKit должно осуществляться в главном потоке, который обрабатывает весь ввод пользователя.

Я не знаком с используемым вами методом API-интерфейса Facebook, но похоже, что он работает с UIImage.Если вы можете заставить его работать с резервным CGImage или использовать другой метод, который не взаимодействует с какими-либо объектами UIKit, вы можете решить эту проблему.(Опять же, я не могу вам помочь, поскольку я не работал ни с одним API Facebook.) Кроме того, вам нужно вызвать метод UIActivityIndicatorView stopAnimating из основного потока.

Youможно настроить очереди примерно так:

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 поздно ночью.)

...