Запишите, какой метод очереди / потока запущен

Есть ли способ зарегистрировать поток или очередь, из которой запущен метод / вызван? Что-то вроде:

- (void)foo { NSLog(@"Running on %@ queue, %@ thread", queue, thread); } 

4 Solutions collect form web for “Запишите, какой метод очереди / потока запущен”

Вы можете получить текущий поток с +[NSThread currentThread] . Это может иметь свойство name , но если вы его не установили, не полагайтесь на него.

Очереди сложнее, потому что существуют разные значения «очереди». Очередь может быть NSOperationQueue , и вы можете получить ее name от +[NSOperationQueue currentQueue] (опять же, если вы его установили).

Тогда есть очереди отправки . Вы можете получить текущую очередь с dispatch_get_current_queue() , но предупредите, что эта функция будет успешной, даже если вызывается из кода, который не связан с очередью (!). В этом случае он возвращает фоновые очереди по умолчанию. Очереди помечены, поэтому вы можете вызвать dispatch_queue_get_label() и если вы создали очередь с меткой, вы получите это.

Таким образом, в принципе, да, вы можете получить очередь или поток – при условии, что весь код имеет связанную диспетчерскую очередь, даже если это не код, который был отправлен. Обычно вы также можете получать значащие имена для этих потоков и очередей, что удобно для отладки: но вы несете ответственность за их имя.

Чтобы получить поток, вы можете использовать

 NSLog(@"Running on %@ thread", [NSThread currentThread]); 

Вы можете получить текущую очередь отправки следующим образом:

 dispatch_queue_t dispatch_get_current_queue(void); 

Но заголовок имеет следующие предупреждения:

Рекомендуется только для отладки и регистрации:

Код не должен делать никаких предположений о возвращенной очереди, если только это не одна из глобальных очередей или очередь, созданная самим кодом. Код не должен предполагать, что синхронное выполнение в очереди безопасно от тупиковой ситуации, если эта очередь не является той, которую возвращает dispatch_get_current_queue ().

поэтому YMMV.

Вот код Swift, который я использую сейчас. Это частично основано на другом ответе, который я ранее размещал здесь в Stack Overflow: https://stackoverflow.com/a/41294559/253938

 /// Struct to contain either the thread name or an (arbitrary) thread number for the current thread. /// This is partly inspired by code in BaseDestination.swift in XCGLogger. Main thread is /// arbitrarily given thread number 0. If no thread name can be determined then the memory address /// of the current Thread object is arbitrarily used as the thread number. /// /// Re use of "__dispatch_queue_get_label(nil)" (seen in XCGLogger) see here: /// https://stackoverflow.com/questions/40186868/get-gcd-label-in-swift-3 internal struct ThreadInfo : CustomStringConvertible { var threadName : String? = nil var threadNumber : Int64? = nil /// Initializer. public init() { // Process main thread (call it thread 0) and threads whose name can be determined if Thread.isMainThread { threadNumber = 0 } else if let threadName = Thread.current.name, !threadName.isEmpty { self.threadName = threadName } else if let queueName = String(validatingUTF8: __dispatch_queue_get_label(nil)), !queueName.isEmpty { threadName = queueName } else { // Convert the memory address of the current Thread object into an Int64 and use it as the // (arbitrary) thread number let objPtr = Unmanaged.passUnretained(Thread.current).toOpaque() let onePtr = UnsafeMutableRawPointer(bitPattern: 1)! // Absolute memory location 1 let rawAddress : Int64 = onePtr.distance(to: objPtr) + 1 // May include high-order bits threadNumber = rawAddress % (256 * 1024 * 1024 * 1024) // Remove possible high-order bits } } /// Method to implement CustomStringConvertible, returning either the thread name if possible or /// else the (arbitrary) thread number. public var description: String { get { return threadName != nil ? String(describing: threadName!) : String(describing: threadNumber!) } } } 

Чтобы использовать это, просто создайте ThreadInfo во время работы в рассматриваемом потоке. Затем вы можете отображать ThreadInfo или вставлять его в данные регистрации.

  let threadInfo = ThreadInfo() print(threadInfo) 
  • отправка более 200 изображений на сервер в многозадачном режиме?
  • NSOperationQueue одновременные операции с новыми потоками, начиная с операций
  • Любой способ сделать dispatch_queue_t работать в одном потоке?
  • Установка основной очереди в качестве базовой очереди для NSOperationQueue
  • AFNetworking setUploadProgressBlock не ведет прямо к 100%
  • NSOperation блокирует рисование UI?
  • Управление связкой NSOperation с зависимостями
  • Отобразить очередь загрузки из Core Data в UITableView
  • NSOperation & Singleton: правильный дизайн согласованности
  • Как отменить зависимости NSOperation?
  • Как отменить NSOperationQueue
  • Interesting Posts

    iOS симулятор не имеет доступа в Интернет

    скорость подсчета массива

    Как я могу отправить UILongPressGesture программно?

    приложение с Objective-C и быстрый сбой кода при запуске в режиме деблокирования, режим отладки

    Что происходит с данными в приложении iOS при обновлении новой версии приложения и обновлении новой версии iOS

    Что такое ошибка CoreData?

    Как определить панель подсказки слов в верхней части клавиатуры или нет?

    Отображение ошибки проверки на iOS UITextField, аналогичной Android TextView.setError ()

    iOS чат APNS, сокеты или промежуток времени

    Как узнать Debug или Release в приложении iOS?

    попытка встроить объект PPSSignatureView

    iPhone: адресная книга иногда стирается

    Программно заданный образ и текст на UIButton

    Realm: модуль был создан более старой версией компилятора и не мог построить модуль объектно-c

    Конец цикла запуска – восстановление пула авторезистов

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.