While waiting for the new version of iBLE I have been testing with the current one. I was wonder why you needed to do the ReadData to start with and cycle through all the available services as the example iBLE code does. It looks like this is needed so iBLE or the iOS handling BLE can capture all the valid characteristics for each available service.
I validated this by issuing a ReadData for a service I did not intend to use and then tried to send a notify for a characteristic of a service I did intend to use. As expected I got the error message "You must first call ReadData and wait for DataAvailable event." Since I did call ReadData first and the send notify is within the DataAvailable routine this error message seems to make no sense. The error message is not complete. What it should be saying is a ReadData for the Service with the Characteristic being used has not been sent first. You don't actually need to cycle through all the Services with a ReadData for each one. You only need to send a ReadData for the service(s) you intend to use.
Now this brings up another problem I am having. With one device I am actually unable to get the available characteristics list back for the service I need. When I send a ReadData for the the Service I get nothing back, no DataAvailable. But I know there should be some from other Bluetooth LE apps. What is different with this Service is it has two characteristics one for Notify and one for Write Data. Could this be a iBLE library problem. Why don't I get the characteristics list back?
For this device I found that I still need to send a ReadData for this service even though I get nothing back otherwise I will get the above error message when I try to set the Notify. So iBLE or iOS is able to capture the two valid characteristics even if they don't come back in a DataAvailable.