2014-09-08 2 views
2

В большинстве моих интервью меня спрашивали о веб-сервисах и многопоточности. Я ничего не сделал, поэтому решил узнать больше о Веб-сервисы и Многопоточность с использованием Grand Central Dispatch.Правильно ли я понимаю эти понятия?

  1. Для веб-сервисов, так что я понимаю, что вам нужно получить данные с помощью класса, таких как NSURLConnection. в основном установите новый NSURL, затем соединение, затем запрос. Вам также необходимо использовать методы API, такие как didConnect, didReceiveData и didFailLoadWithError. После того, как вы получите данные, которые обычно находятся в формате JSON или XML и сохраняются как объект NSData, вы можете сохранить его и проанализировать через него. Существует несколько способов разобрать его, например, с помощью SBJSON или NSXMLParser. Затем вы можете сделать с этим то, что вам нужно.

  2. Для многопоточности Grand Central Dispatch является способом многопоточности в стиле c. В основном, вы используете его, когда вам нужно делать тяжелую тягу от основного потока, чтобы избежать замораживания приложения. Вы можете отправлять синхронно или асинхронно. Асинхронно означает, что метод в основном потоке будет продолжать выполняться, синхронно означает, что он не будет. Вам никогда не нужно использовать GCD вместе с NSURLConnection, потому что NSURLConnection уже выполняет свою работу в фоновом режиме, а затем вызывает делегатов в основном потоке. Но для сохранения и распаковки файлов вы должны использовать GCD. Когда вы вызываете dispatch_async, вы переходите в очередь отправки. Вы можете использовать либо последовательную очередь, либо параллельную очередь. Последовательная очередь будет выполнять задачи в очереди по очереди, в порядке их поступления. Это значение по умолчанию. Одновременно с одновременными очередями могут выполняться одновременно выполняемые задачи.

Мой первый вопрос: есть ли у меня правильное понимание этих двух концепций? Я знаю, что есть много, чтобы узнать о GCD, но я просто хочу убедиться, что у меня есть основные идеи правильно. Кроме того, с GCD, почему кто-то когда-нибудь захочет отправлять синхронно, разве это не победит цель многопоточности?

+0

Я не уверен, что это правильное место для такого «вопроса» –

+0

@MitchWheat Я знаю, я не был уверен, что если бы это было или нет. Знаете ли вы, в какой области стека это было бы лучше? – John

+0

http://programmers.stackexchange.com/ –

ответ

2

Единственная причина для синхронного синхронного сообщения - не допустить продолжения текущего кода до тех пор, пока критическая секция не закончится.

Например, если вы хотите получить какое-то значение из общего ресурса и использовать его сразу же, вам нужно будет отправить синхронно. Если текущему коду не нужно ждать завершения критического раздела или если он может просто отправить дополнительные последующие задачи в одну и ту же последовательную очередь, отправкой асинхронно обычно является предпочтительным.

+0

Спасибо за это объяснение, это имеет смысл. Вы предлагаете мне переместить этот пост в programers.stackexchange? – John

+1

Эта часть 'Мой первый вопрос: есть ли у меня правильное понимание этих двух вещей, до стандартов среднего уровня интервью? 'Удалите это, и если у вас есть вопрос о собеседовании или на рабочем месте, попробуйте сайт программиста – meda

+0

Уверенный, я просто сделал изменения. Спасибо! – John

1

Вы можете сделать синхронный запрос и отправляет его с помощью dispatch_async или dispatch_sync вызова. Он будет полностью работать в фоновом режиме.

-(void)requestSomething:(NSString *)url 
{ 
    NSString *queue_id = @"queue_identifier"; 
    dispatch_queue_t queue = dispatch_queue_create([queue_id UTF8String], 0); 
    dispatch_queue_t main = dispatch_get_main_queue(); 

    dispatch_async(queue, ^{ 

     NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
     NSError  *serviceError = nil; 
     NSURLResponse *serviceResponse = nil; 
     NSData *dataResponse = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&serviceResponse error:&serviceError]; 

     if(serviceError) 
     { 
      dispatch_sync(main, ^{ 

       // Do UI work like removing indicator or show user an alert with description of error using serviceError object. 

       return; 
      }); 
     } 

     else 
     { 
      // Use dataResponse object and parse it as this part of code will not executed on main thread. 

      dispatch_sync(main, ^{ 

       // Do UI work like updating table-view or labels using parsed data or removing indicator 

      }); 
     } 
    }); 

    // If your project is not developed under ARC mechanism, add following line 
    dispatch_release(queue); 
} 
+0

Помните: «Синхронизация» части имени функции означает, что код, который приходит после вызова _dispatch_sync_, не будет продолжаться до тех пор, пока работа внутри блока не будет выполнена. Если мы используем «асинхронную» версию отправки, код после _dispatch_async_ будет запускаться одновременно, то есть он не будет ждать выполнения выше кода. – NSPratik

Смежные вопросы