2013-07-31 73 views
0
回報

我已經寫方法- (空)的getStatus:(的NSString *)網址與返回類型,NSOperationQueue addOperationWithBlock與iOS的

-(NSString) getStatus:(NSString*) statusUrl 
{ 
    NSURL *urlObj = [NSURL URLWithString:[statusUrl 
    stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSError *err; 

    NSString *response = [NSString stringWithContentsOfURL: urlObj encoding: 
    NSUTF8StringEncoding error:&err]; 

    return response; 
} 

stringWithContentsOfURL是在主線程中執行操作,因此,儘管調用這個方法的應用程序觸發了一秒鐘。

所以我需要執行stringWithContentsOfURL函數在後臺線程和獲得響應後,我想返回響應。

我當前的代碼:

-(NSString) getStatus:(NSString*) statusUrl 
{ 
    NSURL *urlObj = [NSURL URLWithString:[statusUrl 
    stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSError *err; 

    NSOperationQueue *rbQueue = [[[NSOperationQueue alloc] init] autorelease]; 
    [rbQueue addOperationWithBlock:^{ 

     NSString *response = [NSString stringWithContentsOfURL: urlObj 
     encoding: NSUTF8StringEncoding error:&err]; 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     return response; 
     }]; 
    }]; 

    return @""; 
} 

但現在我接受空字符串@「」我不能接收響應,我從服務器得到。有什麼辦法可以做同樣的任務嗎?

回答

0

你有沒有注意到這種方法應該有一些改變來完成任務?由於異步方法的性質,您幾乎不可能使用getter。或者吸氣者會輪流阻止主線程。

爲了避免這種情況,我建議您在後臺線程中完成服務器請求後使用NSNotification來更新UI;

或更改您的getter方法的定義從後臺線程結果傳遞給主線程,但異步:

- (void)getStatusAsychronously:(NSString *)statusUrl withCompletionBlock:(void(^)(NSString *result))completionBlock; 

甚至考慮繼承服務器請求NSOperation對象。 NSOperation子類與NSOperationQueue實例非常方便,可以提供一些更有用的功能,如取消操作。

相關問題