亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

管理多個異步NSURLConnection連接

管理多個異步NSURLConnection連接

MMTTMM 2019-09-18 19:26:47
我班上有很多重復的代碼,如下所示:NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request                                                              delegate:self];異步請求的問題是當你有各種請求消失,并且你有一個委托指定將它們全部視為一個實體時,許多分支和丑陋的代碼開始形成:我們回來了什么樣的數據?如果它包含這個,那就做,否則做其他。我認為能夠標記這些異步請求會很有用,就像你能夠使用ID標記視圖一樣。我很好奇什么策略對于管理處理多個異步請求的類最有效。
查看完整描述

3 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

我跟蹤由與之關聯的NSURLConnection鍵入的CFMutableDictionaryRef中的響應。即:


connectionToInfoMapping =

    CFDictionaryCreateMutable(

        kCFAllocatorDefault,

        0,

        &kCFTypeDictionaryKeyCallBacks,

        &kCFTypeDictionaryValueCallBacks);

使用它而不是NSMutableDictionary可能看起來很奇怪,但我這樣做是因為這個CFDictionary只保留其鍵(NSURLConnection),而NSDictionary復制其鍵(并且NSURLConnection不支持復制)。


一旦完成:


CFDictionaryAddValue(

    connectionToInfoMapping,

    connection,

    [NSMutableDictionary

        dictionaryWithObject:[NSMutableData data]

        forKey:@"receivedData"]);

現在我有一個“info”字典,用于每個連接,我可以用它來跟蹤有關連接的信息,“info”字典已經包含一個可變數據對象,我可以用它來存儲答復數據。


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    NSMutableDictionary *connectionInfo =

        CFDictionaryGetValue(connectionToInfoMapping, connection);

    [[connectionInfo objectForKey:@"receivedData"] appendData:data];

}


查看完整回答
反對 回復 2019-09-18
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

我有一個項目,我有兩個不同的NSURLConnections,并希望使用相同的委托。我所做的是在我的類中創建兩個屬性,每個連接一個。然后在委托方法中,我檢查它是否是哪個連接



- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    if (connection == self.savingConnection) {

        [self.savingReturnedData appendData:data];

    }

    else {

        [self.sharingReturnedData appendData:data];

    }

}

這也允許我在需要時按名稱取消特定連接。


查看完整回答
反對 回復 2019-09-18
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

對NSURLConnection進行子類化以保存數據是干凈的,代碼少于其他一些答案,更靈活,并且需要較少考慮參考管理。


// DataURLConnection.h

#import <Foundation/Foundation.h>

@interface DataURLConnection : NSURLConnection

@property(nonatomic, strong) NSMutableData *data;

@end


// DataURLConnection.m

#import "DataURLConnection.h"

@implementation DataURLConnection

@synthesize data;

@end

像使用NSURLConnection一樣使用它并在其data屬性中累積數據:


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

    ((DataURLConnection *)connection).data = [[NSMutableData alloc] init];

}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    [((DataURLConnection *)connection).data appendData:data];

}

而已。


如果你想更進一步,可以添加一個塊作為回調,只需幾行代碼:


// Add to DataURLConnection.h/.m

@property(nonatomic, copy) void (^onComplete)();

像這樣設置:


DataURLConnection *con = [[DataURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];

con.onComplete = ^{

    [self myMethod:con];

};

[con start];

并在加載完成時調用它,如下所示:


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

    ((DataURLConnection *)connection).onComplete();

}

您可以擴展塊以接受參數,或者只將DataURLConnection作為參數傳遞給no-args塊中需要它的方法


查看完整回答
反對 回復 2019-09-18
  • 3 回答
  • 0 關注
  • 472 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號