2012-06-02 70 views
0

我在我的應用程序中使用[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)。通過使用這個我的應用程序在iOS 4.3終止,但它在iOS 5.0中工作正常。NSURLConnection sendAsynchronousRequest:queue:completionHandler無法在iOS 4.3中工作

如何在iOS 4.3中使用它,任何人都可以幫助我。

+1

第一步:使用合理簡短的標題並格式化您的代碼。 – 2012-06-02 05:59:14

回答

2

您要使用的方法是隻在iOS 5可用於之前的操作系統,可以考慮使用

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error 

和包成一個新的線程來實現異步行爲。

+1

更好地繼續使用主線程運行循環中調度的NSURLConnection的異步行爲,並使用適當的委託。 –

+0

@KenThomases - 爲什麼更好的具體原因? H2CO3是不是描述了這種便利方法的用途?只是你會阻止一個線程? – jrturton

+0

是的。由於'NSURLConnection'提供了一個異步模式,因此沒有必要創建一個線程來防止它阻塞主線程。 –

0

Both H2CO3 and Ken Thomases建議是對的。

另外,你可以看看ios4-implementation-of-nsurlconnection-sendasynchronousrequestqueuecompletio

如果您使用主隊列作爲完成處理程序執行的隊列,則可以使用(如Tom建議的)委託模式。爲避免重複的代碼,您可以使用NSURLConnection代表機制的包裝。

在其他情況下,如果你想保持異步行爲,你不想來處理同步調用(如H2CO3建議,請注意,他的建議也有效),並完成處理器在執行不同的隊列,那麼我建議你將異步委託模式包裝在NSOperation類中。這種方法相當困難,但您可以在Concurrent Operations Demystified中找到這樣做的好方法(請參閱這兩篇文章)。

希望它有幫助。

6

這是一個完整的實現,適合我。隨意將其重命名並添加爲一個類別上NSURLConnection,或者只是把它添加在你在工作類中的本地方法。

-(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]; 
} 

編輯 我不得不修改,因爲該方法我在完成塊中進行UIKit調用(例如更新標籤等)。所以在主線程中調用完成塊實際上更安全一些。 (原始版本已註釋掉)

相關問題