2014年5月15日

【iPhone】iOS4.3で、sendAsynchronousRequest



iOS7ベースに、アプリのプログラムをしていたら、
iOS4.3ではよく落ちる。

落ちる原因の1つ、
[NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:completionBlock]

を解決しました。


まずはメソッドを追加します。

-(void)sendAsynchronousRequest:(NSURLRequest*)request queue:(NSOperationQueue*)queue completionHandler:(void(^)(NSURLResponse *response, NSData *data, NSError *error))handler
{
    __block NSURLResponse *response = nil;
    __block NSError *error = nil;
    __block NSData *data = nil;

    // Wrap up synchronous request within a block operation
    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        data = [NSURLConnection sendSynchronousRequest:request 
                                     returningResponse:&response 
                                                 error:&error];
    }];

    // Set completion block
    // EDIT: Set completion block, perform on main thread for safety
    blockOperation.completionBlock = ^{

        // Perform completion on main queue
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            handler(response, data, error);
        }];
    };

    // (or execute completion block on background thread)
    // blockOperation.completionBlock = ^{ handler(response, data, error); };

    // Execute operation
    [queue addOperation:blockOperation];
}

そして、今までの呼び出し元で、

if ([UIDevice currentDevice].systemVersion.floatValue < 5.0) {
        [self sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:handler];
    } else {
        [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:handler];
    }
としました。 handlerはすでに宣言されているブロックです。 これでiOS4.3で落ちる事が無くなりました。 よかったよかった。 参考: NSURLConnection sendAsynchronousRequest:queue:completionHandler not working in iOS 4.3 | stackoverflow