I am pretty new to bonjour/networking with ObjC (although well versed in other areas!) I am asking for a bit of advice - I have an iOS app that will run on multiple iPads, in a store. The apps occasionally have to share some data, and the internet isn't always available so a webservice is not an option, hence I decided on using bonjour.

I have setup the Bonjour/NSNetservices and everything is functioning correctly, the ipads basically form an 'ad-hoc network' and connect automatically at app launch, however I am looking for advice for the following situation:

The app normally shares data in the background, without any user intervention - however there is one function where when a button is pressed on one app, data should be returned from another app remotely. The UI then updates when the data has been received from the other device - however if the connection should be lost to the other device, the data will never reach the users device, and the data will not be displayed. I am wanting to implement some form of timout, but unsure how to do this - any suggestions would be much appreciated!

The process flow for this is something like this:

button press on 'dev 1' > 'dev 1' broadcasts 'dev 2 please send data message' > 'dev 2' responds with requested data [timeout required here] > UI is updated if data is received /[if timeout fires, error message is displayed]

So I really just need a timeout for the last section - and I really cannot think of a way to implement it.

I can post code for this if required.

Thanks!

有帮助吗?

解决方案

This solution may work if you have the possibility to manually cancel the request.

I believe you can use a simple NSTimer to cancel the request after a wait. I'm sure it's not the best solution, but it will probably work.

Here's how I would do it.

Create your timer and an NSInteger (to store the timer value) in your class :

NSTimer *timer;
NSInteger timerValue;

Call this method with timer = [self startTimer]; when you fire your request :

- (NSTimer*)startTimer {

    timerValue = 30;

    return [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTicked:) userInfo:nil repeats:YES];
}

Implement the timerTicked: method :

- (void)timerTicked:(NSTimer*)timer {

    timerValue --;

    if (timerValue <= 0) {
        // Cancel the request
        // Show an alert
    }
}

You can cancel the timer with [timer invalidate]; but remember this will "destroy" your timer, so it won't fire events ever again.

其他提示

As you've not indicated how you are currently requesting data from your other device, I have had to make some assumptions.

You can use NSURLRequest with a timeout using requestWithURL:cachePolicy:timeoutInterval:

See NSURLRequest documentation

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top