Потоки iOS не вызывают специфическую функцию в распределении AdHoc, но работают при запуске из xcode

У меня есть приложение, которое работает, когда я запускаю его на своем iPad из xcode, но когда я готовлю его к распространению AdHoc, оно не будет работать правильно.

Моя тема:

[NSThread detachNewThreadSelector:@selector(wifiBackground) toTarget:self withObject:nil];

WifiBackground это:

-(void)wifiBackground
{

[self setupSocket];
[NSThread sleepForTimeInterval:1.0f];

while (YES) {
    [NSThread sleepForTimeInterval:3.0f];
    if (mNetAlive == [NSNumber numberWithInt:TCP_PORT_OK]) //is connected (can send messages through internet)
    {
        //setup for sending tcp msg, grab network info
        NSString *mWifiname = [self fetchSSIDInfo];
        NSLog(@"mWifiname %@", mWifiname);
        [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"mWifiname %@,,,,",mWifiname] :YES :YES];


        //send messages if new or changed
        if ((wifi_name == nil || wifi_name == (id)[NSNull null] || ([wifi_name length] == 0)) ) { //is null
             NSLog(@"is null");
            [self sendMsgType:WIFI_UDP_CX msgArg1:WIFI_CX_NEW msgArg2:[NSNumber numberWithInt:0] wifiName:mWifiname buffer:nil];
        } else if ([wifi_name containsString:mWifiname]) {
            [self sendMsgType:WIFI_UDP_CX msgArg1:WIFI_CX_CHANGE msgArg2:[NSNumber numberWithInt:0] wifiName:mWifiname buffer:nil];
        }

        wifi_name = mWifiname;
        mTcpState = [NSNumber numberWithInt:TCP_PORT_OPEN];
        retrycount = 0;
        [NSThread sleepForTimeInterval:1.0f];


        while (mTcpState == [NSNumber numberWithInt:TCP_PORT_OPEN] && ([mWifiname containsString:mCurrentSSID])) {
            [self setupSocket];
            [NSThread sleepForTimeInterval:2.0f];

            mTcpAlive = [NSNumber numberWithInt:TCP_PORT_OK];
            mWifiAlert = [NSNumber numberWithInt:0];

            [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"connected %d,mwifiName %@,current ssid %@,,",[asyncSocket isConnected],mWifiname,mCurrentSSID] :YES :YES];
            while ([asyncSocket isConnected] && ([mWifiname containsString:mCurrentSSID])) {
                if (reading == NO) {
                    NSMutableArray *mytx = tx;
                    [self send:mytx];
                }

                //recieve info
                reading = YES;
                [self startRead];
                while (reading == YES) {} //wait
            }
            retrycount++;
            if (retrycount >= 3) {
                NSLog(@"in retry");
                [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"in retry,,,,"] :YES :YES];

                if (([mWifiAlert intValue] == 0) && ![mWifiname containsString:mCurrentSSID]) { mWifiAlert = [NSNumber numberWithInt:1]; }

                [asyncSocket disconnect];
                [NSThread sleepForTimeInterval:1.5f];
                //obviously not connected to internet so shut down
                mTcpAlive =  [NSNumber numberWithInt:TCP_PORT_OFF];
                [self sendMsgType:WIFI_UDP_CX msgArg1:WIFI_CX_RX_ERROR msgArg2:[NSNumber numberWithInt:0] wifiName:mWifiname buffer:nil];
                break; //breaks out of while
            }
        }

        if (!([mWifiname containsString:mCurrentSSID])) {
            NSLog(@"not correct wifi");
            [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"not correct wifi,,,,"] :YES :YES];
            if ([mWifiAlert intValue] == 0) {
                mWifiAlert = [NSNumber numberWithInt:1];
            }

            [NSThread sleepForTimeInterval:5.0f];
        }

     } else {
         noWifiOn++;

         NSLog(@"in else mNetAlive");
         [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"in else mNetAlive,,,,"] :YES :YES];
         if (noWifiOn >= 5) {
             if ([mWifiAlert intValue] == 0) {
                 mWifiAlert = [NSNumber numberWithInt:2];
             }

             NSLog(@"alert view");
             noWifiOn = 0;
             [NSThread sleepForTimeInterval:5.0f];
         }
         mTcpAlive = [NSNumber numberWithInt:TCP_PORT_FAIL];

     }
    [NSThread sleepForTimeInterval:2.0f];
 }
}

SocketDidRead:

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tags
{
reading = YES;
const unsigned char *dataBytes = [data bytes];
NSUInteger dataLength = [data length];

if (buf_ptr == 0) {
    TCP_size = [self strintvalue:[NSString stringWithFormat:@"%02x%02x",dataBytes[2],dataBytes[1]]];
}

buf_ptr = buf_ptr + (int)dataLength;
//NSLog(@"buf ptr = %i",buf_ptr);

if ((buf_ptr < TCP_size) && (TCP_size <=12000)) {
    [ds appendData:data];
    [self startRead];
} else if (buf_ptr == TCP_size){
    [ds appendData:data]; //append the final bit for this package
    //NSLog(@"ds = %@",ds);
    [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"socketDidRead,,,,"] :YES :YES];
    NSLog(@"tcp size = buf_ptr");
    [self writeToCSV:autoErrLogg :[[NSString alloc] initWithFormat:@"tcp size = buf_ptr,,,,"] :YES :YES];
    const unsigned char *allDataBytes = [ds bytes];
    [self processRead:allDataBytes];
    reading = NO;
    mTcpAlive = [NSNumber numberWithInt:TCP_PORT_OK];
    retrycount = 0;
    buf_ptr = 0;
    [ds setLength:0];
} else {
    [self sendMsgType:WIFI_UDP_CX msgArg1:WIFI_CX_RX_ERROR msgArg2:0 wifiName:wifi_name buffer:nil];
    buf_ptr = 0;
    [ds setLength:0];
}
}

По сути: wifiBackground проверяет, подключено ли к Интернету, подключается ли сокет, отправляет ли пакет в сеть (время ожидания 5 с), ожидает окончания чтения (время ожидания 5 с), а затем повторяется с обновлением отправленного пакета., Если сеть закрывается, следует повторить попытку подключения.

Когда я запускаю его как AdHoc, он будет зацикливаться, если не сможет сразу подключиться, но остановится (весь поток), как только будет выполнено чтение без перехода к processRead. например)

socketDidDisconnect
socketDidDisconnect
socketDidRead
tcp size = but_ptr
socketDidDisconnect (error = null)

Почему processRead никогда не вызывается? Это работает с xcode, и я не уверен, почему это не работает сейчас.

Я пытался:

dispatch_async(dispatch_get_main_queue(), ^{
        [self processRead:allDataBytes];
    });

но происходит то же самое, что и выше.

Я собирался попробовать executeSelectorOnMainThread, но так как processRead использует const unsigned char это дает мне ошибку, что это не правильный объект.

1 ответ

Решение

Моя проблема была с этими строками:

//recieve info
reading = YES;
[self startRead];
while (reading == YES) {} //wait

Это может застрять в цикле. Я удалил это и изменил некоторую логику, окружающую это.

Другие вопросы по тегам