2

每当异步找到新位置时,我都会发出一个 http 请求,为了处理请求,我创建了一个名为 background requester 的类来处理所有这些请求。以下代码示例如下。

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
               fromLocation:(CLLocation *)oldLocation
{
 dispatch_queue_t queue;
            queue = dispatch_queue_create("com.test.sample", NULL); //create a serial queue can either be null or DISPATCH_QUEUE_SERIAL


            dispatch_async(queue,
                ^{

                if (bgTask == UIBackgroundTaskInvalid)
                {
                    bgTask=[[UIApplication sharedApplication]
                            beginBackgroundTaskWithExpirationHandler:
                            ^{
                                DDLogInfo(@"Task =%d",bgTask);
                                DDLogInfo(@"Ending bground task due to time expiration");
                                [[UIApplication sharedApplication] endBackgroundTask:bgTask];

                                bgTask = UIBackgroundTaskInvalid;
                            }];

                }

                BackgroundRequester *request = [[BackgroundRequester alloc] initwithLocation:self.currentLocation];

                [request start];

                DDLogInfo(@"Task =%d",bgTask);

                DDLogInfo(@"bg Task remaining time=%f",[[UIApplication sharedApplication] backgroundTimeRemaining]);

                });

}


//background requester class

//the start function will inturn calll the callAsynchrnously method.

-(void) callAsynchronously:(NSString *)url
{
    DDLogInfo(@"Calling where am i from background");
    DDLogInfo(@"Url =%@",reqURL);

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:20.0f];

    responseData = [[NSMutableData alloc] init];
    connect = [NSURLConnection connectionWithRequest:request delegate:self];
    [connect start];
}
4

1 回答 1

1

您不能connectionWithRequest从后台队列中使用(没有在某些运行循环中安排连接)。任何一个

  • 使用sendSynchronousRequest(如果您从这样的后台队列中使用它,这很好),或者

  • 在运行循环中安排连接。如果您深入研究代码,您会看到他们在专用线程上创建了一个运行循环,如果您真的需要这些方法AFNetworking,这让我觉得这是最优雅的解决方案。NSURLConnectionDataDelegate

    您还可以使用主运行循环(尽管我对该解决方案不那么疯狂),例如:

    connect = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
    [connect scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
    [connect start];
    

    另请注意,我没有使用connectionWithRequest(因为它会立即启动连接,这与您对 的调用不兼容start;仅start当您initWithRequest与 a 一起使用时才startImmediately使用NO)。如果您尝试与start结合使用connectionWithRequest,可能会导致问题。

我认为这sendSynchronousRequest是最简单的(也使您不必编写任何NSURLConnectionDataDelegate方法)。但是,如果您需要NSURLConnectionDataDelegate方法(例如,您需要进度更新,您正在使用流协议等),那么请使用该scheduleInRunLoop方法。

于 2013-06-17T05:15:52.490 回答