Pro Tip: Quickly locate apache config errors on Mac OSX

If Apache is refusing connections entirely on Mac OSX (i.e. “Unable to connect” message shows in the browser when trying to load websites hosted on your machine), there’s a good chance there are errors in the Apache config files. This will prevent Apache from starting normally and as a result there will be nothing in the Apache error log itself, as Apache can’t start up.

So to locate where the errors lie, from a terminal window,  run this:

sudo apachectl configtest

That will reveal whether there are syntax errors in the config files (e.g. in httpd.conf or perhaps in the virtual host config file if you are using virtual hosts).

Advertisements

Fixing dispatch_async error in Swift 3/4

If you are copying some older Swift code (say circa 2014/15 or older) off the web to ensure some code is executed on the main queue, such as like this:

dispatch_async(dispatch_get_main_queue(), {
//do something that must be done on the main queue
})

You will be greeted with these 2 errors by Xcode:

‘dispatch_async’ has been replaced by instance method ‘DispatchQueue.async(execute:)’
‘dispatch_get_main_queue()’ has been replaced by property ‘DispatchQueue.main’

And unfortunately Xcode doesn’t offer to “fix” this for you automatically as it often does with other method calls that have been deprecated.

The new way to perform such a call is simply this:

DispatchQueue.main.async {
//do something that must be done on the main queue
}

 

Easy UIPickerView with RxSwift & RxCocoa Magic

RxSwift (and RxCocoa) make it super easy to wire up a UIPickerView for your IOS project. No need to bother with the UIPickerViewDataSource and Delegate protocols and the attendant methods that you would normally be required to implement. Instead, it can be as simple as this in your viewcontroller:

import UIKit
import RxSwift
import RxCocoa

class MyViewController: UIViewController {

  // MARK: – Variables
let
disposeBag = DisposeBag()
var pickerView = UIPickerView()

  override func viewDidLoad() {
    super.viewDidLoad()
    setupRx()
}

func setupRx() {

        //#1 bind your data to pickerview
Observable.just([“Item 1″,”Item 2”, “etc”])
                             .bind(to: pickerView.rx.itemTitles) { _, item in
                return \(item)”
         }.disposed(by: disposeBag)

        //#2 handle pickerview selection
pickerView.rx.itemSelected.asObservable().subscribe(onNext: {item in

            //item.row gives you the index of the selected item, so do what you need with                  it

            //also here you can call .resignFirstResponder() on whatever element brought up the pickerview (e.g. a button) in order to close the pickerview

        }).disposed(by: disposeBag)

        //optional: preselect the second item in pickerview
pickerView.selectRow(1, inComponent: 0, animated: true)

}

} //end class

So what’s going on?

In #1, we bind our data to the pickerview. In the example we simply have a small array of some strings to display. This could instead come from coredata, over the network, or whatever your app requires.

In #2, we set up the subscription to observe selections made on the pickerview. In the closure’s body you can put whatever business logic you need to handle the selection, with “item.row” giving you the index of the selected item from the array. You would also call resignFirstResponder() here in most cases in order to close the pickView.

And that’s it! Neat huh?

 

Creating Unwind Segues in Swift 3 and 4

Unlike (normal forward) segues, I find the process of setting up unwind segues in an IOS Swift project not that intuitive. Hence, whenever I haven’t used one in a while, I need a little reminder on how to get it hooked up.

There’s a nice little write up by developer Luna An here that sums it all up very neatly.

 

Xcode 9 Oddities – External Keyboard Not Working in Simulator

Since “upgrading” to Xcode 9 (specifically v9.3 as of time of writing), I’ve noticed quite a number of annoying oddities – or call them bugs. Today’s nuisance is how the external keyboard (i.e. the physical keyboard you type into) will occasionally just stop working. As in, typing into your physical keyboard will not send any input into the IOS app you are running in the simulator.

As with many things tech related, the good ol’ restart seems to be “fix” it – as in just Quit the simulator and re-run your project.

Not too big a deal, but really, stuff like this just shouldn’t be happening. Come on Apple, we deserve better!