Есть ли проблема, если я использовал синхронизирующие соединения в iPhone? - PullRequest
0 голосов
/ 30 сентября 2011

Я знаю, что шаблон в iPhone - использовать вызовы соединения ASync (используя неофициальные протоколы, реализованные текущим классом).

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

Я считаю недостаточным для реализации модели соединения как Async в служебном классе, потому что я напишу блок кода во ViewControlle, например: (что, IMHO, плохо)

MyUtilityConnection* utilConn = ....
while (true)
{
    if ([utilConn checkUnderlyingAsyncConnectionFinishedLoading]) break;
}
NSData* dataFromUrl = [utilConn dataFromUnderlayingConn];

Итак, вопрос в том, может ли проблема с использованием модели синхронизации в iPhone? и решения?

(А как насчет рисунка, который будет зависать до тех пор, пока не поступят данные ???)

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

ИЗБЕГАТЬ во что бы то ни стало делать синхронные соединения!Это, очевидно, замораживает ваш пользовательский интерфейс (и, конечно, ухудшается, если у вас недостаточно пропускной способности).

Что вы можете сделать, это использовать синтаксис блоков для написания более читабельного кода, когда вам нужно скачатьданные.Создайте класс, который реализует методы делегата NSURLConnection, а затем вызовите блок, когда данные будут готовы.


Посмотрите мой класс OHURLLoader на github, например, который делает именно это(и это только одно решение).

Пример использования:

NSURL* url = ...
NSURLRequest* req = [NSURLRequest requestWithURL:url];

OHURLLoader* loader = [OHURLLoader URLLoaderWithRequest:req];
[loader startRequestWithCompletion:^(NSData* receivedData, NSInteger httpStatusCode) {
    NSLog(@"Download of %@ done (statusCode:%d)",url,statusCode);
    outputTextView.text = loader.receivedString;
} errorHandler:^(NSError *error) {
    NSLog(@"Error while downloading %@: %@",url,error);
    outputTextView.text = [error localizedDescription];
}];
0 голосов
/ 30 сентября 2011

Во время методов синхронизации (sendSynchronousRequest:returningResponse:error:) пользовательский интерфейс не отвечает (при условии, что метод синхронизации вызывается в главном потоке).

Но они подходят для фоновых потоков, самый простой способ выполнить вызовы синхронизации в фоновом потоке с помощью GCD.

...