Stuart Breckenridge

Lackluster HomePod Sales

Joe Rossignol, via MacRumors:

HomePod shipments “could be far below market expectations” this year, according to reputable KGI Securities analyst Ming-Chi Kuo.

[…]

Kuo believes the “major miss” in HomePod shipments could be attributable to the speaker’s design and pricing, among other factors.

[…]

More importantly, Kuo believes Apple needs to improve Siri, support more languages, and make other improvements to the HomePod to stay competitive against Amazon and Google in the smart speaker market. Premium audio quality alone may not be enough for customers to justify dropping $349 on the speaker.

In recent trips to Apple stores, I’ve seen the HomePod but I’ve not seen a single person trying one out.


— Supported by —


High Sierra Storage Space Woes

High Sierra is an unforgivable mess when it comes to communicating free storage space.

What exactly are you meant to do when Boot Camp tells you that you need 39GB free space, Finder tell you that 126.14GB is available, and About This Mac tells you that 207.69GB is available?

Storage Space Woes

Update 2018-04-10: Here’s what worked for me after a bit of digging on Stack Overflow:

sudo tmutil thinlocalsnapshots / 999999999999

I’m still left with Finder and About this Mac communicating storage values that are about 80GB apart.


Apps of a Feather

After June 19th, 2018, “streaming services” at Twitter will be removed. This means two things for third-party apps:

  1. Push notifications will no longer arrive
  2. Timelines won’t refresh automatically

If you use an app like Talon, Tweetbot, Tweetings, or Twitterrific, there is no way for its developer to fix these issues.

We are incredibly eager to update our apps. However, despite many requests for clarification and guidance, Twitter has not provided a way for us to recreate the lost functionality. We’ve been waiting for more than a year.

Either Twitter fix this, or I’m off the platform.

Update 2018-04-06:
Stephen Hackett:

If this comes to pass, I think I’ll be on Twitter far less than I am today, and while that may be a good thing for me personally, it’s bad for the developers of these apps, and bad for Twitter itself. The company should fix this.

Manton Reece:

Dieter Bohn:

Juli Clover:

The developers behind Tweetbot, Twitterrific, Talon, and Tweetings are asking customers to contact the @TwitterDev account to correct the situation and to use the #BreakingMyTwitter hashtag to spread awareness.


macOS 10.13.4 eGPU Support

The 10.13.4 release of macOS includes full support for eGPUs. As detailed in the support note:

With eGPU support in macOS 10.13.4, you can:
• Accelerate applications that use Metal, OpenGL, and OpenCL
• Connect additional external monitors and displays
• Use virtual reality headsets plugged into the eGPU
• Charge your MacBook Pro while using the eGPU
• Use an eGPU with your MacBook Pro while its built-in display is closed
• Connect an eGPU while a user is logged in
• Connect more than one eGPU using the multiple Thunderbolt 3 (USB-C) ports on your Mac
• Use the menu bar item to safely disconnect the eGPU
• View the activity levels of built-in and external GPUs. Open Activity Monitor, then choose Window > GPU History

What you cannot do with a connected eGPU, and which is major disappointment, is accelerate the internal display of an iMac or MacBook.


Encapsulating Table View Row Functions in a Struct

During a recent refactor of a table view data source, I created a struct for table view row data that would encapsulate both UI data and any necessary function to perform when the row is selected. It looks like this:

struct TableViewRowData {
    var title: String
    var performingFunction: (() -> Void)?
}

Adding a few TableViewRowData entries to an array:

let dataSource: [TableViewRowData] = [
    TableViewRowData(title: "Row 1", performingFunction: {
		print("Row 1")
	}),
    TableViewRowData(title: "Row 2", performingFunction: {
		print("Row 2")
	})
]

Then, in the UITableViewDataSource:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dataSource.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "rowCell", for: indexPath) as? TableViewCell else {
        return UITableViewCell()
    }

    cell.titleLabel.text = dataSource[indexPath.row].title

    return cell
}

And in the UITableViewDelegate:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    dataSource[indexPath.row].performingFunction?()
    tableView.deselectRow(at: indexPath, animated: true)
    tableView.reloadData()
}

This approach keeps the UITableViewDataSource and UITableViewDelegate a bit tidier.