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

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

- (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) 
  • UIImageView + AFNetworking очередь запросов изображения блокирует другие сетевые запросы от RestKit
  • Является ли гарантированным серийным номером?
  • Отобразить очередь загрузки из Core Data в UITableView
  • Как возобновить тайм-аут NSOperationQueue в iOS?
  • Как отменить зависимости NSOperation?
  • Отменить NSOperation из NSOperationQueue
  • NSInvocationOperation обратный вызов слишком рано
  • Установка параллельной работы для NSOperationQueue вызывает только то количество операций
  • порядок операций с addOperationWithBlock
  • Можно ли установить значение NetworkActivityIndicatorVisible во вторичном потоке?
  • NSArray Утечка внутри setCompletionBlock
  • Interesting Posts

    Предотвратите скриншот / запуск экрана Google Картона на iOS

    iOS Swift3 проверяет значение nil для объекта ViewController

    UITableView мерцает / заикается при вводе текста при автоматическом изменении размера TextView

    Настройка заголовка UIButton с помощью API внешнего вида iOS 5

    Может ли «Uninitialized Buffer Data» быть ложным положительным в OpenGL ES Analyzer?

    Сортировка NSArray с пользовательскими объектами

    Добавить ячейку внизу UITableView в iOS

    Опубликовать только приложение iOS с помощью sdk 3.1?

    NSDate dateFromString 2 месяца неправильно?

    Как обрабатывать события с несколькими сегментами управления в одном представлении

    Как изменить формат даты в iphone sdk

    Недопустимая поддержка Swift / недействительная реализация быстрой

    Как правильно реализовать ленивый экземпляр с использованием свойства @IBOutlet в Swift

    возможно ли переместить индикатор UIScrollView с правой стороны влево?

    Как связать только iOS 4.0 перечисления в проекте с целью развертывания <4.0?

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