Программа для iPhone работает на симуляторе, но не на iPhone - PullRequest
1 голос
/ 07 апреля 2011

Я использую NSURLconnection для подключения к веб-сервису и получения данных. Поскольку я подключаюсь к различным веб-сервисам, я устанавливаю для accessibilityLabel строку, описывающую веб-сервис.

В методе делегата

-(void) connectionDidFinishLoading:(NSURLConnection *) connection;

Я проверяю connection.accessibilityLabel и запускаю соответствующий код.

Это прекрасно работает в симуляторе.

Однако на самом iPhone connection.accessibilityLabel всегда равен нулю.

Кто-нибудь знает почему?

(соединение все еще работает должным образом, и я получаю свои данные на iPhone, я просто не знаю, что с ним делать, так как метка доступности, кажется, не установлена ​​должным образом или стерта или что-то в этом роде.)

Заранее спасибо.

РЕДАКТИРОВАТЬ: вот код, который я использую, чтобы установить соединение и назначить метку

// create the connection with the request
// and start loading the data
ConnectionDelegate *connDel = [[ConnectionDelegate alloc] init];
connDel.delegate = self;
conn = [[NSURLConnection alloc] initWithRequest:theRequest delegate:connDel];
conn.accessibilityLabel = label;

if (conn) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere
    connDel.webData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
    NSLog(@"Connection Failed");
}

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Не уверен, почему ваша accessibilityLabel работает только на симуляторе, но в принятом ответе на этот вопрос можно найти более расширяемый подход: Управление несколькими асинхронными соединениями NSURLConnection

По сути, вы можете создать изменяемый CFDictionary с вашим соединением в качестве ключа и любым другим значением в качестве значения (в связанном ответе он использует объект полученныйData, но вы можете использовать все, что захотите).

Таким образом, чтобы адаптировать его решение для вашей ситуации, вы можете сделать что-то вроде этого:

Перед созданием ваших запросов:

connectionToInfoMapping =
    CFDictionaryCreateMutable(
        kCFAllocatorDefault,
        0,
        &kCFTypeDictionaryKeyCallBacks,
        &kCFTypeDictionaryValueCallBacks);

После создания каждого соединения:

CFDictionaryAddValue(
    connectionToInfoMapping,
    connection,
    [NSMutableDictionary
        dictionaryWithObject:@"someName"
        forKey:@"connectionName"]);

Тогда в вашем connectionDidFinishLoading: методе:

-(void) connectionDidFinishLoading:(NSURLConnection *) connection
{
    NSMutableDictionary *connectionInfo = CFDictionaryGetValue(connectionToInfoMapping, connection);
    NSString *connectionName = (NSString *)[connectionInfo objectForKey:@"connectionName"];
    if ([connectionName isEqualToString:@"connectionA"]) {
        //Do something
    }
}

Вышесказанное можно легко расширить, чтобы иметь несколько свойств, сопоставленных соединением (просто добавьте больше ключей и значений в NSMutableDictionary, который вы добавляете в CFDictionary).

0 голосов
/ 14 апреля 2011

Я считаю, что проблема с использованием accessibilityLabel. Рассматривая документы для него, он предназначен для использования в элементах управления UIKit для отображения правильной метки на элементе доступности. Его поведение на NSURLConnection объектах не определено. Я думаю, вам нужно найти другой способ идентификации веб-службы для вашего делегата.

Использование NSDictionary в ConnectionDelegate для привязки веб-службы к активным соединениям, как рекомендуется @theChrisKent, будет работать.

Вы также можете создать подкласс NSURLConnection и добавить к нему webServiceLabel iVar & свойство.

...