Post not yet marked as solved
For what it’s worth, I get around this with a rendition that doesn’t take a delegate parameter, cutting the Gordian knot:
extension URLSession {
public nonisolated func download(with url: URL) async throws -> (URL, URLResponse) {
try await download(from: url)
}
}
Post not yet marked as solved
Then you can just do the appropriate os_signpost calls. Personally, I use a helper swift class to make sure that the category is correct and the format of the strings is correct. E.g.
import Foundation
import os.log
// MARK: - CustomPointsOfInterestLog
/// Custom Points of Interest Log
///
/// This allows logging of events and intervals to a custom “Points of Interest” tool in Instruments.
///
/// Needless to say, this assumes that you have installed the custom Points of Interest tool in Instrumewnts.
class CustomPointsOfInterestLog {
fileprivate let log: OSLog
init(subsystem: String) {
log = OSLog(subsystem: subsystem, category: "Interval")
}
func event(name: StaticString = "Points", label: String, concept: EventConcept = .debug) {
os_signpost(.event, log: log, name: name, InstrumentsInterval.formatString, label, concept.rawValue)
}
func interval<T>(name: StaticString = "Intervals", label: String, concept: EventConcept = .debug, block: () throws -> T) rethrows -> T {
let interval = InstrumentsInterval(name: name, label: label, concept: concept, log: self)
interval.begin()
defer { interval.end() }
return try block()
}
}
// MARK: - EventConcept
extension CustomPointsOfInterestLog {
/// EventConcept enumeration
///
/// This is used to dictate the color of the intervals in our custom instrument.
/// See [Event Concept Engineering Type](https://help.apple.com/instruments/developer/mac/current/#/dev66257045).
enum EventConcept: String {
case success = "Success"
case failure = "Failure"
case fault = "Fault"
case critical = "Critical"
case error = "Error"
case debug = "Debug"
case pedantic = "Pedantic"
case info = "Info"
case signpost = "Signpost"
case veryLow = "Very Low"
case low = "Low"
case moderate = "Moderate"
case high = "High"
case red = "Red"
case orange = "Orange"
case blue = "Blue"
case purple = "Purple"
case green = "Green"
}
}
// MARK: - InstrumentsInterval
/// Interval to be shown in custom instrument when profiling app
struct InstrumentsInterval {
fileprivate static let formatString: StaticString = "Label:%{public}@,Concept:%{public}@"
let name: StaticString
let label: String
let concept: CustomPointsOfInterestLog.EventConcept
let log: CustomPointsOfInterestLog
let id: OSSignpostID
init(name: StaticString, label: String, concept: CustomPointsOfInterestLog.EventConcept = .debug, log: CustomPointsOfInterestLog) {
self.name = name
self.concept = concept
self.label = label
self.log = log
self.id = OSSignpostID(log: log.log)
}
/// Manually begin an interval
func begin() {
os_signpost(.begin, log: log.log, name: name, signpostID: id, Self.formatString, label, concept.rawValue)
}
/// Manually end an interval
func end() {
os_signpost(.end, log: log.log, name: name, signpostID: id)
}
/// Manually emit an event
func event() {
os_signpost(.event, log: log.log, name: name, signpostID: id, Self.formatString, label, concept.rawValue)
}
}
And then I can do logging like so:
private let log = CustomPointsOfInterestLog(subsystem: "Example")
class Example {
func synchronousTask() {
log.interval(name: "Example", label: #function, concept: .green) {
Thread.sleep(forTimeInterval: 2)
}
}
}
And I can see my colored output:
Post not yet marked as solved
I color my points of interest using a custom instrument
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Instruments Developer Help: https://help.apple.com/instruments/developer/mac/current/ -->
<package>
<id>com.robertmryan.CustomInterval</id>
<version>0.2</version>
<title>Custom Points of Interest</title>
<owner>
<name>Robert Ryan</name>
</owner>
<import-schema>os-signpost</import-schema>
<!-- See https://help.apple.com/instruments/developer/mac/current/#/dev536412616 -->
<os-signpost-point-schema>
<id>custom-point-schema</id>
<title>Points</title>
<owner>
<name>Robert Ryan</name>
</owner>
<purpose>Provide mechanism for multicolored events posted by `os_signpost`; The string generated by `os_signpost` must be in form of "Label:%d,Concept:%{public}@", where "Label" is string that will control what text appears in the event, and "Concept" is one of the strings listed in https://help.apple.com/instruments/developer/mac/current/#/dev66257045 that dictates the color of the interval. No spaces after the commas within this string.</purpose>
<note>That message must use that printf-style format, not embedding the values in the format string literal.</note>
<!-- you can constrain this to a particular subsystem if you'd like:
<subsystem>"com.domain.MyApp"</subsystem>
-->
<category>"Interval"</category>
<name>?name</name>
<pattern>
<message>"Label:" ?label ",Concept:" ?concept</message>
</pattern>
<column>
<mnemonic>name</mnemonic>
<title>Name</title>
<type>string</type>
<expression>?name</expression>
</column>
<column>
<mnemonic>label</mnemonic>
<title>Label</title>
<type>string</type>
<expression>?label</expression>
</column>
<column>
<mnemonic>concept</mnemonic>
<title>Concept</title>
<type>event-concept</type>
<expression>?concept</expression>
</column>
</os-signpost-point-schema>
<os-signpost-interval-schema>
<id>custom-interval-schema</id>
<title>Intervals</title>
<owner>
<name>Robert Ryan</name>
</owner>
<purpose>Provide mechanism for multicolored intervals posted by `os_signpost`; The string generated by `os_signpost` must be in form of "Label:%d,Concept:%{public}@", where "Label" is string that will control what text appears in the interval, and "Concept" is one of the strings listed in https://help.apple.com/instruments/developer/mac/current/#/dev66257045 that dictates the color of the interval. No spaces after the commas within this string.</purpose>
<note>That message must use that printf-style format, not embedding the values in the format string literal.</note>
<!-- you can constrain this to a particular subsystem if you'd like:
<subsystem>"com.domain.MyApp"</subsystem>
-->
<category>"Interval"</category>
<name>?name</name>
<start-pattern>
<message>"Label:" ?label ",Concept:" ?concept</message>
</start-pattern>
<column>
<mnemonic>name</mnemonic>
<title>Name</title>
<type>string</type>
<expression>?name</expression>
</column>
<column>
<mnemonic>label</mnemonic>
<title>Label</title>
<type>string</type>
<expression>?label</expression>
</column>
<column>
<mnemonic>concept</mnemonic>
<title>Concept</title>
<type>event-concept</type>
<expression>?concept</expression>
</column>
</os-signpost-interval-schema>
<instrument>
<id>com.robertmryan.CustomInterval.instrument</id>
<title>Custom Points of Interest</title>
<category>Behavior</category>
<purpose>Provide multi-colored intervals as dictated by the "event-concept" parsed from the `start-pattern` string.</purpose>
<icon>Points of Interest</icon>
<limitations></limitations>
<create-table>
<id>custom-interval-table</id>
<schema-ref>custom-interval-schema</schema-ref>
</create-table>
<create-table>
<id>custom-point-table</id>
<schema-ref>custom-point-schema</schema-ref>
</create-table>
<graph>
<title>Custom Interval Graph</title>
<lane>
<title>Points</title>
<table-ref>custom-point-table</table-ref>
<plot-template>
<instance-by>name</instance-by>
<label-format>%s</label-format>
<value-from>name</value-from>
<color-from>concept</color-from>
<label-from>label</label-from>
</plot-template>
</lane>
<lane>
<title>Intervals</title>
<table-ref>custom-interval-table</table-ref>
<plot-template>
<instance-by>name</instance-by>
<label-format>%s</label-format>
<value-from>name</value-from>
<color-from>concept</color-from>
<label-from>label</label-from>
<qualified-by>layout-qualifier</qualified-by>
</plot-template>
</lane>
</graph>
<list>
<title>Custom Regions of Interest</title>
<table-ref>custom-interval-table</table-ref>
<column>name</column>
<column>label</column>
<column>concept</column>
<column>start</column>
<column>duration</column>
</list>
<list>
<title>Custom Points of Interest</title>
<table-ref>custom-point-table</table-ref>
<column>name</column>
<column>label</column>
<column>concept</column>
</list>
</instrument>
</package>
Post not yet marked as solved
As carlos_reyes - https://developer.apple.com/forums/profile/carlos_reyes said:
I had the same issue. I restarted the MacBook in safe mode (press and hold the Shift key while it boots) and I was able to perform the update. I hope this will work for you. Worked for me.
Post not yet marked as solved
Yes, for me too. Re-downloaded this morning, restarted computer, and then perform the "software update" in "system preferences" and it worked. It took a while, and there were moments that it looked like it froze, but after 45 minutes or so, it successfully installed.This same process (which I repeated several times) didn't work yesterday, but it worked this morning, so it would appear that Apple has fixed the installer during the interim.
Post not yet marked as solved
I'm getting same message.MacBook Pro (15-inch, 2018)
Post not yet marked as solved
I haven't found method documentation. And the quick help is not very useful:(That looks like it was generated from the source.)But see Using Key-Value Observing in Swift.